aldrin-parser 0.13.0

Aldrin schema parser library.
Documentation
use super::{Resolver, SchemaFile};
use std::collections::HashMap;
use std::io::Error;

#[derive(Debug)]
pub struct MemoryResolver {
    main_schema: Schema,
    schemas: HashMap<String, Schema>,
}

impl MemoryResolver {
    pub fn new(name: impl Into<String>, source: Result<String, Error>) -> Self {
        Self {
            main_schema: Schema::new(name.into(), source),
            schemas: HashMap::new(),
        }
    }

    pub fn add(&mut self, name: impl Into<String>, source: Result<String, Error>) -> &mut Self {
        let name = name.into();
        self.schemas.insert(name.clone(), Schema::new(name, source));
        self
    }
}

impl Resolver for MemoryResolver {
    fn main_schema(&self) -> SchemaFile<'_> {
        self.main_schema.as_schema_file()
    }

    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
        if name == self.main_schema.name {
            Some(self.main_schema.as_schema_file())
        } else {
            self.schemas.get(name).map(Schema::as_schema_file)
        }
    }
}

#[derive(Debug)]
struct Schema {
    name: String,
    path: String,
    source: Result<String, Error>,
}

impl Schema {
    fn new(name: String, source: Result<String, Error>) -> Self {
        Self {
            path: format!("({name})"),
            name,
            source,
        }
    }

    fn as_schema_file(&self) -> SchemaFile<'_> {
        SchemaFile::new(&self.name, &self.path, self.source.as_deref())
    }
}