13#define SAJSON_UNSORTED_OBJECT_KEYS
14#define SAJSON_NUMBERS_AS_STRINGS
15#include "third_party/sajson.h"
27 case sajson::TYPE_INTEGER:
return "<integer>";
28 case sajson::TYPE_DOUBLE:
return "<double>";
29 case sajson::TYPE_NULL:
return "<null>";
30 case sajson::TYPE_FALSE:
return "<false>";
31 case sajson::TYPE_TRUE:
return "<true>";
32 case sajson::TYPE_STRING:
return "<string>";
33 case sajson::TYPE_ARRAY:
return "<array>";
34 case sajson::TYPE_OBJECT:
return "<object>";
35 default:
return "<unknown type>";
40 switch (val.get_type()) {
41 case sajson::TYPE_DOUBLE:
42 return val.as_string();
43 case sajson::TYPE_NULL:
45 case sajson::TYPE_FALSE:
47 case sajson::TYPE_STRING:
48 return quote(val.as_string());
57 sajson::value
root = s.get_root();
58 if (
root.get_type() != sajson::TYPE_OBJECT ||
root.get_length() != 1)
60 std::string block_name =
root.get_object_key(0).as_string();
62 fail(
"not mmJSON - top level key should start with data_\n"
63 "(if you use gemmi-cif2json to write JSON, use -m for mmJSON)");
64 d.blocks.emplace_back(block_name.substr(5));
65 std::vector<Item>& items =
d.blocks[0].items;
66 sajson::value
top =
root.get_object_value(0);
67 if (
top.get_type() != sajson::TYPE_OBJECT)
69 for (
size_t i = 0;
i !=
top.get_length(); ++
i) {
72 if (
category.get_type() != sajson::TYPE_OBJECT ||
74 category.get_object_value(0).get_type() != sajson::TYPE_ARRAY)
80 Loop& loop = items.back().loop;
87 if (
arr.get_type() != sajson::TYPE_ARRAY)
90 fail(
"Expected array of length ", std::to_string(
cif_rows),
" not ",
91 std::to_string(
arr.get_length()));
95 Loop& loop = items.back().loop;
96 loop.
tags.emplace_back(std::move(tag));
106 const std::string& name=
"mmJSON") {
108 sajson::document
json = sajson::parse(sajson::dynamic_allocation(),
109 sajson::mutable_string_view(size,
buffer));
110 if (!
json.is_valid())
111 fail(name +
":", std::to_string(
json.get_error_line()),
" error: ",
112 json.get_error_message_as_string());
125 std::string name =
input.is_stdin() ?
"stdin" :
input.path();
std::string as_cif_value(const sajson::value &val)
void fill_document_from_sajson(Document &d, const sajson::document &s)
std::string quote(std::string v)
Document read_mmjson_insitu(char *buffer, size_t size, const std::string &name="mmJSON")
Document read_mmjson(T &&input)
Document read_mmjson_file(const std::string &path)
std::string json_type_as_string(sajson::type t)
CharArray read_into_buffer(T &&input)
bool starts_with(const std::string &str, const std::string &prefix)
CharArray read_file_into_buffer(const std::string &path)
void fail(const std::string &msg)
std::vector< std::string > tags
std::vector< std::string > values