schematic/validate/
extends.rs

1use crate::config::{
2    ExtendsFrom, Path, PathSegment, ValidateError, ValidateResult, is_file_like, is_secure_url,
3    is_source_format, is_url_like,
4};
5
6/// Validate an `extend` value is either a file path or secure URL.
7pub 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
35/// Validate a list of `extend` values are either a file path or secure URL.
36pub 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
53/// Validate an `extend` value is either a file path or secure URL.
54pub 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}