aldrin_parser/resolver/
memory.rs

1use super::{Resolver, SchemaFile};
2use std::collections::HashMap;
3use std::io::Error;
4
5#[derive(Debug)]
6pub struct MemoryResolver {
7    main_schema: Schema,
8    schemas: HashMap<String, Schema>,
9}
10
11impl MemoryResolver {
12    pub fn new(name: impl Into<String>, source: Result<String, Error>) -> Self {
13        Self {
14            main_schema: Schema::new(name.into(), source),
15            schemas: HashMap::new(),
16        }
17    }
18
19    pub fn add(&mut self, name: impl Into<String>, source: Result<String, Error>) -> &mut Self {
20        let name = name.into();
21        self.schemas.insert(name.clone(), Schema::new(name, source));
22        self
23    }
24}
25
26impl Resolver for MemoryResolver {
27    fn main_schema(&self) -> SchemaFile<'_> {
28        self.main_schema.as_schema_file()
29    }
30
31    fn resolve(&mut self, name: &str) -> Option<SchemaFile<'_>> {
32        if name == self.main_schema.name {
33            Some(self.main_schema.as_schema_file())
34        } else {
35            self.schemas.get(name).map(Schema::as_schema_file)
36        }
37    }
38}
39
40#[derive(Debug)]
41struct Schema {
42    name: String,
43    path: String,
44    source: Result<String, Error>,
45}
46
47impl Schema {
48    fn new(name: String, source: Result<String, Error>) -> Self {
49        Self {
50            path: format!("({name})"),
51            name,
52            source,
53        }
54    }
55
56    fn as_schema_file(&self) -> SchemaFile<'_> {
57        SchemaFile::new(&self.name, &self.path, self.source.as_deref())
58    }
59}