1 use anyhow
::{bail, format_err, Error}
;
4 // Generate canonical json
5 pub fn to_canonical_json(value
: &Value
) -> Result
<Vec
<u8>, Error
> {
6 let mut data
= Vec
::new();
7 write_canonical_json(value
, &mut data
)?
;
11 pub fn write_canonical_json(value
: &Value
, output
: &mut Vec
<u8>) -> Result
<(), Error
> {
13 Value
::Null
=> bail
!("got unexpected null value"),
14 Value
::String(_
) | Value
::Number(_
) | Value
::Bool(_
) => {
15 serde_json
::to_writer(output
, &value
)?
;
17 Value
::Array(list
) => {
19 let mut iter
= list
.iter();
20 if let Some(item
) = iter
.next() {
21 write_canonical_json(item
, output
)?
;
24 write_canonical_json(item
, output
)?
;
29 Value
::Object(map
) => {
31 let mut keys
: Vec
<&str> = map
.keys().map(String
::as_str
).collect();
33 let mut iter
= keys
.into_iter();
34 if let Some(key
) = iter
.next() {
35 serde_json
::to_writer(&mut *output
, &key
)?
;
37 write_canonical_json(&map
[key
], output
)?
;
40 serde_json
::to_writer(&mut *output
, &key
)?
;
42 write_canonical_json(&map
[key
], output
)?
;
51 pub fn json_object_to_query(data
: Value
) -> Result
<String
, Error
> {
52 let mut query
= url
::form_urlencoded
::Serializer
::new(String
::new());
54 let object
= data
.as_object().ok_or_else(|| {
55 format_err
!("json_object_to_query: got wrong data type (expected object).")
58 for (key
, value
) in object
{
61 query
.append_pair(key
, &b
.to_string());
64 query
.append_pair(key
, &n
.to_string());
67 query
.append_pair(key
, s
);
69 Value
::Array(arr
) => {
73 query
.append_pair(key
, &b
.to_string());
76 query
.append_pair(key
, &n
.to_string());
79 query
.append_pair(key
, s
);
82 "json_object_to_query: unable to handle complex array data types."
87 _
=> bail
!("json_object_to_query: unable to handle complex data types."),
94 pub fn required_string_param
<'a
>(param
: &'a Value
, name
: &str) -> Result
<&'a
str, Error
> {
95 match param
[name
].as_str() {
97 None
=> bail
!("missing parameter '{}'", name
),
101 pub fn required_string_property
<'a
>(param
: &'a Value
, name
: &str) -> Result
<&'a
str, Error
> {
102 match param
[name
].as_str() {
104 None
=> bail
!("missing property '{}'", name
),
108 pub fn required_integer_param(param
: &Value
, name
: &str) -> Result
<i64, Error
> {
109 match param
[name
].as_i64() {
111 None
=> bail
!("missing parameter '{}'", name
),
115 pub fn required_integer_property(param
: &Value
, name
: &str) -> Result
<i64, Error
> {
116 match param
[name
].as_i64() {
118 None
=> bail
!("missing property '{}'", name
),
122 pub fn required_array_param
<'a
>(param
: &'a Value
, name
: &str) -> Result
<&'a
[Value
], Error
> {
123 match param
[name
].as_array() {
125 None
=> bail
!("missing parameter '{}'", name
),
129 pub fn required_array_property
<'a
>(param
: &'a Value
, name
: &str) -> Result
<&'a
[Value
], Error
> {
130 match param
[name
].as_array() {
132 None
=> bail
!("missing property '{}'", name
),