Module: HDLRuby::Serializer

Defined in:
lib/HDLRuby/hruby_serializer.rb

Overview

Module adding serialization capability to HDLRuby classes

Instance Method Summary collapse

Instance Method Details

#to_basic(top = true, ref = false, types = {}, generated = [[]]) ⇒ Object

Converts the object to a basic structure which can be dumped into an easy-to-write YAML string.

Other parameters: +top+:: indicates if the object is the top of the description or not. If it is the top, the namespace it comes from is kept. +types+:: contains the type objects which will have to be converted separately. def to_basic(top = true, types = {}) Converts the object to a basic structure which can be dumped into an easy-to-write YAML string.

Other parameters: +top+:: indicates if the object is the top of the description or not. If it is the top, the namespace it comes from is kept. +ref+:: indicates if the object is a reference or not. If it is a reference, its generation is to be skipped for later. +types+:: contains the type objects which will have to be converted separately. +generated+:: is the stack of the generated named objects in the current context.



291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
# File 'lib/HDLRuby/hruby_serializer.rb', line 291

def to_basic(top = true, ref = false, types = {}, generated = [[]])
    # if !top and TO_BASICS_TYPES.include?(self.class) and
    # Ensure it is a initial ref: if the object has no name
    # it is the case.
    if ref then
        ref = self.respond_to?(:name) && !self.name.empty? 
    end
    # Process the object
    if !top and ref then
        # Refered object, but not the top, add it to the types list
        # without converting it if not already generated.
        unless generated.flatten.include?(self.name)
            # puts "Adding type with name=#{self.name}\n"
            types[self.name] = self
        end
        # puts "types=#{types}"
        # And return the name.
        return self.name.to_s
    end
    # puts "generating #{self.class} with name=#{self.name}\n" if self.respond_to?(:name)
    # Self is generated, remove it from the types to generate.
    generated[-1] << self.name if self.respond_to?(:name)
    # Add a level to the stack of generated named objects.
    generated << []
    # print "to_basic for class=#{self.class}\n"
    # Create the hash which will contains the content of the object.
    content = { }
    # Create the resulting hash with a single entry whose key
    # is the class name and whose value is the content of the
    # object.
    class_name = self.class.to_s
    # Keep only the class name
    class_name = HDLRuby.const_reduce(class_name)

    result = { class_name => content }
    # Fills the contents with the instance variables value.
    self.instance_variables.each do |var_sym|
        # Skip the fields that should not be serialized
        # next if var_sym == :@parent # Now added to FIELDS_TO_EXCLUDE
        next if (FIELDS_TO_EXCLUDE[self.class] and 
                 FIELDS_TO_EXCLUDE[self.class].include?(var_sym) )
        # print "for instance variable #{var_sym}...\n"
        # Skip the parent.
        # Get the value of the variable.
        var_val = self.instance_variable_get(var_sym)
        # Sets the content.
        # content[var_sym] = HDLRuby.value_to_basic(var_val,types)
        value = HDLRuby.value_to_basic(
            # FIELDS_OF_REF[self.class].include?(var_sym) && 
            # var_val.respond_to?(:name) && !var_val.name.empty?,
            FIELDS_OF_REF[self.class].include?(var_sym),
            var_val, types,generated)
        # Remove the @ from the symbol.
        var_sym = var_sym.to_s[1..-1]
        # EMPTY VALUES ARE NOT SKIPPED
        # # Empty values are skipped
        # unless value.respond_to?(:empty?) and value.empty? then
        #     content[var_sym] = value
        # end
        content[var_sym] = value
    end

    if top and !types.empty? then
        # It is a top and there where types.
        # The result is a sequence including each type and the
        # current object.
        result = [ result ]
        # Sort the type so that data types comes first.
        to_treat = types.each.partition {|name,type| !type.is_a?(Type) }
        to_treat.flatten!(1)
        while !to_treat.empty?
            others = {}
            to_treat.each do |name,type|
                # print "Dumping type with name=#{name}\n"
                # type_basic = type.to_basic(true)
                type_basic = type.to_basic(true,others)
                type_basic = type_basic.last if type_basic.is_a?(Array)
                result.unshift(type_basic)
            end
            to_treat = others
        end
            
    end

    # Restore the stack of generated named objets.
    generated.pop

    # Return the resulting hash.
    return result
end

#to_yamlObject

Converts the object to YAML string.



383
384
385
386
387
388
389
390
391
392
# File 'lib/HDLRuby/hruby_serializer.rb', line 383

def to_yaml
    # Convert the object to basic representations
    basics = to_basic
    # puts "basics=#{basics}"
    basics = [ basics ] unless basics.is_a?(Array)
    # Remove duplicate descriptions
    basics.uniq! { |elem| elem.first[1]["name"] }
    # Convert the basic representations to YAML
    return YAML.dump_stream(*basics)
end