use serde_json::Value;
use crate::error::{IssueCode, VldError};
pub trait VldInput {
fn to_json_value(&self) -> Result<Value, VldError>;
}
impl VldInput for Value {
fn to_json_value(&self) -> Result<Value, VldError> {
Ok(self.clone())
}
}
impl VldInput for str {
fn to_json_value(&self) -> Result<Value, VldError> {
serde_json::from_str(self)
.map_err(|e| VldError::single(IssueCode::ParseError, format!("Invalid JSON: {}", e)))
}
}
impl VldInput for String {
fn to_json_value(&self) -> Result<Value, VldError> {
self.as_str().to_json_value()
}
}
impl VldInput for [u8] {
fn to_json_value(&self) -> Result<Value, VldError> {
serde_json::from_slice(self)
.map_err(|e| VldError::single(IssueCode::ParseError, format!("Invalid JSON: {}", e)))
}
}
#[cfg(feature = "std")]
impl VldInput for std::path::Path {
fn to_json_value(&self) -> Result<Value, VldError> {
let content = std::fs::read_to_string(self).map_err(|e| {
VldError::single(IssueCode::IoError, format!("Failed to read file: {}", e))
})?;
content.as_str().to_json_value()
}
}
#[cfg(feature = "std")]
impl VldInput for std::path::PathBuf {
fn to_json_value(&self) -> Result<Value, VldError> {
self.as_path().to_json_value()
}
}