schematic/validate/
extends.rs1use crate::config::{
2 ExtendsFrom, Path, PathSegment, ValidateError, ValidateResult, is_file_like, is_secure_url,
3 is_source_format, is_url_like,
4};
5
6pub fn extends_string<D, C>(
8 value: &str,
9 _data: &D,
10 _context: &C,
11 _finalize: bool,
12) -> ValidateResult {
13 let is_file = is_file_like(value);
14 let is_url = is_url_like(value);
15
16 if !is_url && !is_file {
17 return Err(ValidateError::new(
18 "only file paths and URLs can be extended",
19 ));
20 }
21
22 if !value.is_empty() && !is_source_format(value) {
23 return Err(ValidateError::new(
24 "invalid format, try a supported extension",
25 ));
26 }
27
28 if is_url && !is_secure_url(value) {
29 return Err(ValidateError::new("only secure URLs can be extended"));
30 }
31
32 Ok(())
33}
34
35pub fn extends_list<D, C>(
37 values: &[String],
38 data: &D,
39 context: &C,
40 finalize: bool,
41) -> ValidateResult {
42 for (i, value) in values.iter().enumerate() {
43 if let Err(mut error) = extends_string(value, data, context, finalize) {
44 error.path = Path::new(vec![PathSegment::Index(i)]);
45
46 return Err(error);
47 }
48 }
49
50 Ok(())
51}
52
53pub fn extends_from<D, C>(
55 value: &ExtendsFrom,
56 data: &D,
57 context: &C,
58 finalize: bool,
59) -> ValidateResult {
60 match value {
61 ExtendsFrom::String(string) => extends_string(string, data, context, finalize)?,
62 ExtendsFrom::List(list) => extends_list(list, data, context, finalize)?,
63 };
64
65 Ok(())
66}