Class: Lutaml::Lml::Format::Adapter::StandardAdapter

Inherits:
Document
  • Object
show all
Defined in:
lib/lutaml/lml/format/adapter/standard_adapter.rb

Constant Summary collapse

TYPE_KEY =
"__type__"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.instance_to_hash(instance) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/lutaml/lml/format/adapter/standard_adapter.rb', line 27

def self.instance_to_hash(instance)
  return nil unless instance

  hash = {}
  hash[TYPE_KEY] = instance.type if instance.type

  instance.each_attribute do |name, value, nested|
    if nested.any?
      hashes = nested.map { |i| instance_to_hash(i) }
      hash[name] = nested.one? ? hashes.first : hashes
    elsif value.is_a?(Array)
      hash[name] = value.map { |v| primitive_value(v) }
    elsif !value.nil?
      hash[name] = primitive_value(value)
    end
  end

  if instance.instance
    hash.merge!(instance_to_hash(instance.instance))
  end

  hash
end

.parse(data, _options = {}) ⇒ Object



10
11
12
13
14
15
16
# File 'lib/lutaml/lml/format/adapter/standard_adapter.rb', line 10

def self.parse(data, _options = {})
  return data if data.is_a?(Hash)

  input = data.is_a?(IO) ? data : StringIO.new(data.to_s)
  doc = Lutaml::Lml::Pipeline.call(input, resolve: false)
  instance_to_hash(doc.instance)
end

.primitive_value(val) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/lutaml/lml/format/adapter/standard_adapter.rb', line 51

def self.primitive_value(val)
  case val
  when TrueClass, FalseClass then val
  when Integer, Float then val
  else val.to_s
  end
end

Instance Method Details

#to_lml(_options = {}) ⇒ Object



18
19
20
21
22
23
# File 'lib/lutaml/lml/format/adapter/standard_adapter.rb', line 18

def to_lml(_options = {})
  attrs = @attributes.dup
  type_name = attrs.delete(TYPE_KEY) || "Data"
  body = hash_to_lml_body(attrs)
  "instance #{type_name} {\n#{body}\n}"
end