#![allow(dead_code)]
use ahk_cli::json::{self, Read};
pub fn field_text<'a>(value: &'a Read, name: &str) -> &'a str {
value
.field_text(name)
.unwrap_or_else(|| panic!("the value has no text {name:?}"))
}
pub struct Json {
root: Read,
}
impl Json {
pub fn parse(text: &str) -> Json {
Json {
root: json::read(text).expect("the report is json"),
}
}
pub fn get(&self, name: &str) -> &Read {
self.root
.get(name)
.unwrap_or_else(|| panic!("the report has no field {name:?}"))
}
pub fn text(&self, name: &str) -> &str {
self.get(name)
.as_str()
.unwrap_or_else(|| panic!("the field {name:?} is not a text"))
}
pub fn number(&self, name: &str) -> i64 {
self.get(name)
.as_i64()
.unwrap_or_else(|| panic!("the field {name:?} is not a number"))
}
pub fn boolean(&self, name: &str) -> bool {
self.get(name)
.as_bool()
.unwrap_or_else(|| panic!("the field {name:?} is not a truth value"))
}
pub fn array(&self, name: &str) -> &[Read] {
self.get(name).array()
}
pub fn names(&self) -> Vec<&str> {
self.root.names()
}
}
#[cfg(test)]
mod tests {
use super::Json;
#[test]
fn a_report_is_read() {
let document = Json::parse("{\"ok\":true,\"names\":[\"a\",\"b\"],\"line\":3}");
assert!(document.boolean("ok"));
assert_eq!(document.number("line"), 3);
let names = document.array("names");
assert_eq!(names.len(), 2);
assert_eq!(names[1].as_str(), Some("b"));
assert!(document.names().contains(&"ok"));
}
#[test]
fn a_text_with_an_escape_is_read_back() {
let document = Json::parse("{\"error\":\"a\\\"b\\\\c\\nd\"}");
assert_eq!(document.text("error"), "a\"b\\c\nd");
}
}