module FXF

FXF

Constants

SCALARS

Scalar object types. These are all the data types in JSON except for hashes and arrays.

VERSION

version 1.0

Public Class Methods

generate(struct, opts={}) click to toggle source

Generates a FXF JSON string.

# File lib/fxf.rb, line 17
def self.generate(struct, opts={})
        # $tm.hrm
        rv = {}
        self.generate_object(rv, struct)
        rv = {'root'=>rv.keys[0], 'objects'=>rv}
        
        # return JSON
        if opts['pretty']
                return JSON.pretty_generate(rv)
        else
                return JSON.generate(rv)
        end
end
parse(fxf) click to toggle source

Parses an FXF string and returns the structure it defines.

# File lib/fxf.rb, line 41
def self.parse(fxf)
        parser = FXF::Parser.new(fxf)
        return parser.parse()
end

Private Class Methods

generate_object(rv, obj) click to toggle source
# File lib/fxf.rb, line 62
def self.generate_object(rv, obj)
        # $tm.hrm
        key = obj.object_id.to_s
        
        # add to rv
        if not rv.has_key?(key)
                # scalar
                if SCALARS.include?(obj.class)
                        rv[key] = obj
                        
                # hash
                elsif obj.is_a?(Hash)
                        hsh = rv[key] = {}
                        
                        obj.each do |k, v|
                                hsh[k] = self.generate_object(rv, v)
                        end
                        
                # array
                elsif obj.is_a?(Array)
                        arr = rv[key] = []
                        
                        obj.each do |v|
                                arr.push self.generate_object(rv, v)
                        end
                        
                # to_fxf
                elsif obj.respond_to?('to_fxf')
                        dfn = {}
                        dfn['class'] = obj.class.to_s
                        dfn['details'] = obj.to_fxf()
                        object_dfn rv, key, 'custom', dfn
                        
                # standard class
                elsif translator = FXF::Standard::TO_FXF[obj.class.to_s]
                        dfn = translator.call(obj)
                        object_dfn rv, key, 'standard', dfn
                
                # else unknown class
                else
                        # build details
                        details = {}
                        
                        # string
                        if obj.respond_to?('to_s')
                                details['str'] = obj.to_s
                        end
                        
                        # buid definition
                        dfn = {}
                        dfn['scope'] = 'unrecognized'
                        dfn['class'] = obj.class.to_s
                        dfn['details'] = details
                        
                        # store
                        rv[key] = [dfn]
                end
        end
        
        # return
        return key
end
object_dfn(rv, key, scope, dfn) click to toggle source
# File lib/fxf.rb, line 132
def self.object_dfn(rv, key, scope, dfn)
        # $tm.hrm
        export = {}
        rv[key] = [export]
        export['scope'] = scope
        export['class'] = dfn['class']
        export['details'] = {}
        
        # add object references
        if dfn['details']
                if dfn['details'].is_a?(Hash)
                        dfn['details'].each do |k, v|
                                export['details'][k] = self.generate_object(rv, v)
                        end
                else
                        raise 'custom-object-details-must-be-hash'
                end
        end
end