seanedwards/cfer

View on GitHub
lib/cfer/util/json.rb

Summary

Maintainability
A
0 mins
Test Coverage
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