mod definition;
mod field;
mod value_type;
pub use self::{definition::Definition, field::Field, value_type::ValueType};
use super::TypeName;
use crate::Error;
use eyre::{Result, WrapErr};
use serde::Deserialize;
use std::{fs, path::Path, str::FromStr};
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct Schema {
namespace: TypeName,
acc_prefix: String,
val_prefix: String,
#[serde(rename = "definition")]
definitions: Vec<Definition>,
}
impl Schema {
pub fn new(
namespace: TypeName,
acc_prefix: impl Into<String>,
val_prefix: impl Into<String>,
definitions: impl Into<Vec<Definition>>,
) -> Self {
Self {
namespace,
acc_prefix: acc_prefix.into(),
val_prefix: val_prefix.into(),
definitions: definitions.into(),
}
}
pub fn load_toml(path: impl AsRef<Path>) -> Result<Self> {
match fs::read_to_string(path.as_ref()) {
Ok(s) => s.parse(),
Err(e) => Err(Error::Io)
.wrap_err_with(|| format!("couldn't open {}: {}", path.as_ref().display(), e)),
}
}
pub fn namespace(&self) -> &TypeName {
&self.namespace
}
pub fn acc_prefix(&self) -> &str {
self.acc_prefix.as_ref()
}
pub fn val_prefix(&self) -> &str {
self.val_prefix.as_ref()
}
pub fn definitions(&self) -> &[Definition] {
&self.definitions
}
pub fn get_definition(&self, type_name: &TypeName) -> Option<&Definition> {
self.definitions
.iter()
.find(|def| def.type_name() == type_name)
}
}
impl FromStr for Schema {
type Err = eyre::Report;
fn from_str(s: &str) -> Result<Self> {
Ok(toml::from_str(s)?)
}
}