aldrin_parser/resolver/
memory.rs1use 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}