Skip to main content

camel_component_validator/
resolver.rs

1//! Resource resolution for schema files.
2//!
3//! Currently only filesystem paths are supported.
4
5use camel_component_api::CamelError;
6
7// TODO(VAL-013): Resource resolution currently filesystem-only.
8// Future: support classpath:, http:, and data: URIs.
9
10/// Resolves schema resources. Currently only filesystem paths are supported.
11/// TODO(VAL-013): Implement URL and classpath resolvers.
12pub trait ResourceResolver: Send + Sync {
13    /// Read the resource at `path` into bytes.
14    fn resolve(&self, path: &str) -> Result<Vec<u8>, CamelError>;
15}
16
17/// Default filesystem-based resolver.
18pub struct FilesystemResolver;
19
20impl ResourceResolver for FilesystemResolver {
21    fn resolve(&self, path: &str) -> Result<Vec<u8>, CamelError> {
22        std::fs::read(path).map_err(|e| {
23            CamelError::EndpointCreationFailed(format!("failed to read schema file '{path}': {e}"))
24        })
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn filesystem_resolver_reads_existing_file() {
34        let mut f = tempfile::Builder::new().suffix(".json").tempfile().unwrap();
35        use std::io::Write;
36        f.write_all(b"hello").unwrap();
37        let resolver = FilesystemResolver;
38        let data = resolver.resolve(f.path().to_str().unwrap()).unwrap();
39        assert_eq!(data, b"hello");
40    }
41
42    #[test]
43    fn filesystem_resolver_errors_on_missing_file() {
44        let resolver = FilesystemResolver;
45        let result = resolver.resolve("/nonexistent/file.json");
46        assert!(result.is_err());
47    }
48}