Sha256: 0c942d5e765186d3912ab216c815c6d2e015427f83548f7dd417a989f4476926

Contents?: true

Size: 1.25 KB

Versions: 6

Compression:

Stored size: 1.25 KB

Contents

require 'rainbow'
require 'json'

module Cfer::Util::Json
  class << self

  QUOTE = '"'
  LBRACE = Rainbow('{').green
  RBRACE = Rainbow('}').green
  LBRACKET = Rainbow('[').green
  RBRACKET = Rainbow(']').green
  COLON = Rainbow(': ').green

  def format_json(item)
    case item
    when Hash
      format_hash(item)
    when Array
      format_array(item)
    when String
      format_string(item)
    when Numeric
      format_number(item)
    when TrueClass || FalseClass
      format_bool(item)
    else
      format_string(item.to_s)
    end
  end

  private
  def format_string(s)
    s.to_json
  end

  def format_number(n)
    n.to_json
  end

  def format_bool(b)
    b.to_json
  end

  def format_hash(h)
    LBRACE +
    if h.empty?
      ' '
    else
      "\n" +
      indent do
        h.map { |k, v| format_pair(k, v) }.join(",\n")
      end +
      "\n"
    end +
    RBRACE
  end

  def format_pair(k, v)
    QUOTE + Rainbow(k).bright + QUOTE + COLON + format_json(v)
  end

  def format_array(a)
    LBRACKET +
    if a.empty?
      ' '
    else
      "\n" +
      indent do
        a.map { |i| format_json(i) }.join(",\n")
      end +
      "\n"
    end +
    RBRACKET
  end

  def indent
    str = yield
    "  " + str.gsub(/\n/, "\n  ")
  end

  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
cfer-1.0.0 lib/cfer/util/json.rb
cfer-0.8.0 lib/cfer/util/json.rb
cfer-0.7.0 lib/cfer/util/json.rb
cfer-0.6.2 lib/cfer/util/json.rb
cfer-0.6.1 lib/cfer/util/json.rb
cfer-0.6.0 lib/cfer/util/json.rb