Page Menu
Home
Musing Studio
Search
Configure Global Search
Log In
Files
F12570869
main.go
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Subscribers
None
main.go
View Options
// Command toml-test-encoder satisfies the toml-test interface for testing
// TOML encoders. Namely, it accepts JSON on stdin and outputs TOML on stdout.
package
main
import
(
"encoding/json"
"flag"
"log"
"os"
"path"
"strconv"
"time"
"github.com/BurntSushi/toml"
)
func
init
()
{
log
.
SetFlags
(
0
)
flag
.
Usage
=
usage
flag
.
Parse
()
}
func
usage
()
{
log
.
Printf
(
"Usage: %s < json-file\n"
,
path
.
Base
(
os
.
Args
[
0
]))
flag
.
PrintDefaults
()
os
.
Exit
(
1
)
}
func
main
()
{
if
flag
.
NArg
()
!=
0
{
flag
.
Usage
()
}
var
tmp
interface
{}
if
err
:=
json
.
NewDecoder
(
os
.
Stdin
).
Decode
(
&
tmp
);
err
!=
nil
{
log
.
Fatalf
(
"Error decoding JSON: %s"
,
err
)
}
tomlData
:=
translate
(
tmp
)
if
err
:=
toml
.
NewEncoder
(
os
.
Stdout
).
Encode
(
tomlData
);
err
!=
nil
{
log
.
Fatalf
(
"Error encoding TOML: %s"
,
err
)
}
}
func
translate
(
typedJson
interface
{})
interface
{}
{
switch
v
:=
typedJson
.(
type
)
{
case
map
[
string
]
interface
{}:
if
len
(
v
)
==
2
&&
in
(
"type"
,
v
)
&&
in
(
"value"
,
v
)
{
return
untag
(
v
)
}
m
:=
make
(
map
[
string
]
interface
{},
len
(
v
))
for
k
,
v2
:=
range
v
{
m
[
k
]
=
translate
(
v2
)
}
return
m
case
[]
interface
{}:
tabArray
:=
make
([]
map
[
string
]
interface
{},
len
(
v
))
for
i
:=
range
v
{
if
m
,
ok
:=
translate
(
v
[
i
]).(
map
[
string
]
interface
{});
ok
{
tabArray
[
i
]
=
m
}
else
{
log
.
Fatalf
(
"JSON arrays may only contain objects. This "
+
"corresponds to only tables being allowed in "
+
"TOML table arrays."
)
}
}
return
tabArray
}
log
.
Fatalf
(
"Unrecognized JSON format '%T'."
,
typedJson
)
panic
(
"unreachable"
)
}
func
untag
(
typed
map
[
string
]
interface
{})
interface
{}
{
t
:=
typed
[
"type"
].(
string
)
v
:=
typed
[
"value"
]
switch
t
{
case
"string"
:
return
v
.(
string
)
case
"integer"
:
v
:=
v
.(
string
)
n
,
err
:=
strconv
.
Atoi
(
v
)
if
err
!=
nil
{
log
.
Fatalf
(
"Could not parse '%s' as integer: %s"
,
v
,
err
)
}
return
n
case
"float"
:
v
:=
v
.(
string
)
f
,
err
:=
strconv
.
ParseFloat
(
v
,
64
)
if
err
!=
nil
{
log
.
Fatalf
(
"Could not parse '%s' as float64: %s"
,
v
,
err
)
}
return
f
case
"datetime"
:
v
:=
v
.(
string
)
t
,
err
:=
time
.
Parse
(
"2006-01-02T15:04:05Z"
,
v
)
if
err
!=
nil
{
log
.
Fatalf
(
"Could not parse '%s' as a datetime: %s"
,
v
,
err
)
}
return
t
case
"bool"
:
v
:=
v
.(
string
)
switch
v
{
case
"true"
:
return
true
case
"false"
:
return
false
}
log
.
Fatalf
(
"Could not parse '%s' as a boolean."
,
v
)
case
"array"
:
v
:=
v
.([]
interface
{})
array
:=
make
([]
interface
{},
len
(
v
))
for
i
:=
range
v
{
if
m
,
ok
:=
v
[
i
].(
map
[
string
]
interface
{});
ok
{
array
[
i
]
=
untag
(
m
)
}
else
{
log
.
Fatalf
(
"Arrays may only contain other arrays or "
+
"primitive values, but found a '%T'."
,
m
)
}
}
return
array
}
log
.
Fatalf
(
"Unrecognized tag type '%s'."
,
t
)
panic
(
"unreachable"
)
}
func
in
(
key
string
,
m
map
[
string
]
interface
{})
bool
{
_
,
ok
:=
m
[
key
]
return
ok
}
File Metadata
Details
Attached
Mime Type
text/x-c
Expires
Sun, Nov 23, 8:05 AM (1 d, 21 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3503993
Attached To
rWAGTK writeas-gtk
Event Timeline
Log In to Comment