Skip to content

Instantly share code, notes, and snippets.

@dk949
Created September 3, 2022 08:33
Show Gist options
  • Save dk949/1551073c0ef667e1ff200d73516eca6e to your computer and use it in GitHub Desktop.
Save dk949/1551073c0ef667e1ff200d73516eca6e to your computer and use it in GitHub Desktop.
COnvert msgpack to json
/+dub.json:
{
"authors": ["dk949"],
"copyright": "Copyright © 2022, dk949",
"dependencies": {"msgpack-d": "~>1.0.4"},
"description": "Convert msgpack to JSON",
"license": "MIT",
"name": "msgpack2json"
}
+/
// Compile with `dub build msgpack2json --single`
import msgpack, std;
int help(string name, int r) {
writeln("Usage: ", baseName(name), " [FILE]");
return r;
}
ubyte[] readFile(File f) {
if (f.size != ulong.max)
return f.rawRead(new ubyte[f.size]);
else {
ubyte[] buff = new ubyte[256];
ulong pos = 0;
while (true) {
auto slice = f.rawRead(buff[pos .. $]);
pos += slice.length;
if (f.eof)
break;
buff.length *= 2;
}
buff.length = pos;
return buff;
}
}
int main(string[] argv) {
try {
auto f = stdin;
switch (argv.length) {
case 1:
break;
case 2: {
if (argv[1] == "-h" || argv[1] == "--help") {
return help(argv[0], 0);
} else if (!exists(argv[1])) {
stderr.writeln("no such file ", argv[1]);
return 1;
} else {
f = File(argv[1]);
}
break;
}
default:
return help(argv[0], 1);
}
try {
ubyte[] packed = f.readFile;
packed.unpack
.toJSONValue
.toPrettyString(JSONOptions.doNotEscapeSlashes)
.writeln;
return 0;
} catch (Exception e) {
stderr.writeln("Failed to convert to json: ", e.message);
return 2;
}
} catch (Exception e) {
stderr.writeln("Internal error: ", e.message);
return 3;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment