use crate::error::{ErrorDiagnostic, Result};
pub fn from_str<'a, T>(s: &'a str) -> Result<T>
where
T: serde::Deserialize<'a>,
{
serde_json::from_str(s).map_err(ErrorDiagnostic::new)
}
pub fn from_slice<'a, T>(bytes: &'a [u8]) -> Result<T>
where
T: serde::Deserialize<'a>,
{
serde_json::from_slice(bytes).map_err(ErrorDiagnostic::new)
}
pub fn from_reader<R, T>(reader: R) -> Result<T>
where
R: std::io::Read,
T: serde::de::DeserializeOwned,
{
serde_json::from_reader(reader).map_err(ErrorDiagnostic::new)
}
#[cfg(test)]
mod tests {
use super::*;
use serde::Deserialize;
#[test]
fn from_str_api_compiles() {
let json = r#"{"name": "test"}"#;
let result: Result<serde_json::Value> = from_str(json);
assert!(result.is_ok());
let value = result.unwrap();
assert_eq!(value["name"], "test");
}
#[test]
fn from_str_with_struct() {
#[derive(Deserialize, Debug, PartialEq)]
struct User {
name: String,
age: u32,
}
let json = r#"{"name": "Alice", "age": 30}"#;
let result: Result<User> = from_str(json);
assert!(result.is_ok());
let user = result.unwrap();
assert_eq!(user.name, "Alice");
assert_eq!(user.age, 30);
}
#[test]
fn from_str_error_returns_error_diagnostic() {
let json = r#"{"name": "Bob", "age": "not_a_number"}"#;
let result: Result<serde_json::Value> = from_str(json);
assert!(result.is_ok());
}
#[test]
fn from_slice_api_compiles() {
let bytes = br#"{"key": "value"}"#;
let result: Result<serde_json::Value> = from_slice(bytes);
assert!(result.is_ok());
let value = result.unwrap();
assert_eq!(value["key"], "value");
}
#[test]
fn from_slice_with_struct() {
#[derive(Deserialize, Debug, PartialEq)]
struct Config {
enabled: bool,
}
let bytes = br#"{"enabled": true}"#;
let result: Result<Config> = from_slice(bytes);
assert!(result.is_ok());
let config = result.unwrap();
assert!(config.enabled);
}
#[test]
fn from_reader_api_compiles() {
use std::io::Cursor;
let json = r#"{"test": 123}"#;
let reader = Cursor::new(json);
let result: Result<serde_json::Value> = from_reader(reader);
assert!(result.is_ok());
let value = result.unwrap();
assert_eq!(value["test"], 123);
}
#[test]
fn from_reader_with_struct() {
use std::io::Cursor;
#[derive(Deserialize, Debug, PartialEq)]
struct Point {
x: f64,
y: f64,
}
let json = r#"{"x": 1.5, "y": 2.5}"#;
let reader = Cursor::new(json);
let result: Result<Point> = from_reader(reader);
assert!(result.is_ok());
let point = result.unwrap();
assert_eq!(point.x, 1.5);
assert_eq!(point.y, 2.5);
}
}