pub mod builder;
pub mod infer;
pub mod json_schema;
pub mod schema_def;
pub mod validate;
use crate::error::{GermanicError, GermanicResult};
use crate::types::GrmHeader;
use std::path::Path;
pub fn compile_dynamic(schema_path: &Path, data_path: &Path) -> GermanicResult<Vec<u8>> {
let (schema, _warnings) = load_schema_auto(schema_path)?;
let json_str = std::fs::read_to_string(data_path)?;
if json_str.len() > crate::pre_validate::MAX_INPUT_SIZE {
return Err(GermanicError::General(format!(
"input size {} bytes exceeds maximum of {} bytes",
json_str.len(),
crate::pre_validate::MAX_INPUT_SIZE
)));
}
let data: serde_json::Value = serde_json::from_str(&json_str)?;
crate::pre_validate::pre_validate(&json_str, &data)
.map_err(|errors| GermanicError::General(errors.join("; ")))?;
validate::validate_against_schema(&schema, &data).map_err(GermanicError::Validation)?;
let payload = builder::build_flatbuffer(&schema, &data)?;
let header = GrmHeader::new(&schema.schema_id);
let header_bytes = header
.to_bytes()
.map_err(|e| GermanicError::General(e.to_string()))?;
let mut output = Vec::with_capacity(header_bytes.len() + payload.len());
output.extend_from_slice(&header_bytes);
output.extend_from_slice(&payload);
Ok(output)
}
pub fn compile_dynamic_from_values(
schema: &schema_def::SchemaDefinition,
data: &serde_json::Value,
) -> GermanicResult<Vec<u8>> {
crate::pre_validate::pre_validate_value(data)
.map_err(|errors| GermanicError::General(errors.join("; ")))?;
validate::validate_against_schema(schema, data).map_err(GermanicError::Validation)?;
let payload = builder::build_flatbuffer(schema, data)?;
let header = GrmHeader::new(&schema.schema_id);
let header_bytes = header
.to_bytes()
.map_err(|e| GermanicError::General(e.to_string()))?;
let mut output = Vec::with_capacity(header_bytes.len() + payload.len());
output.extend_from_slice(&header_bytes);
output.extend_from_slice(&payload);
Ok(output)
}
pub fn load_schema_auto(
schema_path: &Path,
) -> GermanicResult<(schema_def::SchemaDefinition, Vec<String>)> {
let content = std::fs::read_to_string(schema_path)?;
if json_schema::is_json_schema(&content) {
json_schema::convert_json_schema(&content)
} else {
let schema: schema_def::SchemaDefinition = serde_json::from_str(&content)?;
Ok((schema, Vec::new()))
}
}