File: decoder.rb

package info (click to toggle)
ruby-perfect-toml 0.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 224 kB
  • sloc: ruby: 1,929; makefile: 4
file content (35 lines) | stat: -rwxr-xr-x 1,207 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/usr/bin/env ruby

require_relative "../lib/perfect_toml"
require "json"

def convert(toml)
  case toml
  when Hash then toml.to_h {|k, v| [k, convert(v)] }
  when Array then toml.map {|v| convert(v) }
  when String then { "type" => "string", "value" => toml }
  when Integer then { "type" => "integer", "value" => toml.to_s }
  when Float
    str = toml.nan? ? "nan" : toml.infinite? ? "#{ toml > 0 ? "+" : "-" }inf" : toml.to_s
    str = str.sub(/\.0\z/, "")
    { "type" => "float", "value" => str }
  when true then { "type" => "bool", "value" => "true" }
  when false then { "type" => "bool", "value" => "false" }
  when Time
    str = toml.strftime("%Y-%m-%dT%H:%M:%S.%4N")
    str = str.sub(/\.0000\z/, "")
    zone = toml.strftime("%:z")
    str << (zone == "+00:00" ? "Z" : zone)
    { "type" => "datetime", "value" => str }
  when PerfectTOML::LocalDateTime
    { "type" => "datetime-local", "value" => toml.to_s }
  when PerfectTOML::LocalDate
    { "type" => "date-local", "value" => toml.to_s }
  when PerfectTOML::LocalTime
    { "type" => "time-local", "value" => toml.to_s }
  else
    raise "unknown type: %p" % toml
  end
end

puts JSON.generate(convert(PerfectTOML.parse($stdin.read)))