Class: Struct

Inherits:
Object show all
Defined in:
lib/rbyaml/rubytypes.rb

Direct Known Subclasses

RbYAML::Node, RbYAML::ScalarAnalysis

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.yaml_new(klass, tag, val) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/rbyaml/rubytypes.rb', line 55

def self.yaml_new( klass, tag, val )
  if Hash === val
    struct_type = nil
    
    #
    # Use existing Struct if it exists
    #
    props = {}
    val.delete_if { |k,v| props[k] = v if k =~ /^@/ }
    begin
      struct_name, struct_type = RbYAML.read_type_class( tag, Struct )
    rescue NameError
    end
    if !struct_type
      struct_def = [ tag.split( /:/, 4 ).last ]
      struct_type = Struct.new( *struct_def.concat( val.keys.collect { |k| k.intern } ) ) 
    end
  
    #
    # Set the Struct properties
    #
    st = RbYAML::object_maker( struct_type, {} )
    st.members.each do |m|
      st.send( "#{m}=", val[m] )
    end
    props.each do |k,v|
      st.instance_variable_set(k, v)
    end
    st
  else
    raise RbYAML::TypeError, "Invalid Ruby Struct: " + val.inspect
  end
end

.yaml_tag_class_nameObject



53
# File 'lib/rbyaml/rubytypes.rb', line 53

def self.yaml_tag_class_name; self.name.gsub( "Struct::", "" ); end

.yaml_tag_read_class(name) ⇒ Object



54
# File 'lib/rbyaml/rubytypes.rb', line 54

def self.yaml_tag_read_class( name ); "Struct::#{ name }"; end

Instance Method Details

#to_yaml_node(repr) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/rbyaml/rubytypes.rb', line 88

def to_yaml_node( repr)
  RbYAML::quick_emit_node( object_id, repr ) do |out|
    mep = {}
    self.members.each do |m|
      mep[m] = self[m]
    end
    self.to_yaml_properties.each do |m|
      mep[m]=instance_variable_get( m )
    end
    
    #
    # Basic struct is passed as a YAML map
    #
    out.map( taguri, mep, to_yaml_style )
  end
end