aldrin-parser 0.13.0

Aldrin schema parser library.
Documentation
mod fs;
mod memory;

use std::io::Error;

pub use fs::FilesystemResolver;
pub use memory::MemoryResolver;

pub trait Resolver {
    fn main_schema(&self) -> SchemaFile<'_>;
    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>>;
}

impl<T: Resolver + ?Sized> Resolver for &mut T {
    fn main_schema(&self) -> SchemaFile<'_> {
        (**self).main_schema()
    }

    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
        (**self).resolve(name)
    }
}

impl<T: Resolver + ?Sized> Resolver for Box<T> {
    fn main_schema(&self) -> SchemaFile<'_> {
        (**self).main_schema()
    }

    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
        (**self).resolve(name)
    }
}

#[derive(Debug)]
pub struct SchemaFile<'a> {
    name: &'a str,
    path: &'a str,
    source: Result<&'a str, &'a Error>,
}

impl<'a> SchemaFile<'a> {
    pub fn new<N, P, S>(name: &'a N, path: &'a P, source: Result<&'a S, &'a Error>) -> Self
    where
        N: AsRef<str> + ?Sized,
        P: AsRef<str> + ?Sized,
        S: AsRef<str> + ?Sized,
    {
        Self {
            name: name.as_ref(),
            path: path.as_ref(),
            source: source.map(AsRef::as_ref),
        }
    }

    pub fn with_source<N, P, S>(name: &'a N, path: &'a P, source: &'a S) -> Self
    where
        N: AsRef<str> + ?Sized,
        P: AsRef<str> + ?Sized,
        S: AsRef<str> + ?Sized,
    {
        Self::new(name, path, Ok(source))
    }

    pub fn with_error<N, P>(name: &'a N, path: &'a P, err: &'a Error) -> Self
    where
        N: AsRef<str> + ?Sized,
        P: AsRef<str> + ?Sized,
    {
        Self::new(name, path, Err::<&str, _>(err))
    }

    pub fn name(&self) -> &'a str {
        self.name
    }

    pub fn path(&self) -> &'a str {
        self.path
    }

    pub fn source(&self) -> Result<&'a str, &'a Error> {
        self.source
    }
}