nimbus_fml/editing/
error_kind.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2* License, v. 2.0. If a copy of the MPL was not distributed with this
3* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5use std::collections::BTreeSet;
6
7use serde_json::{Map, Value};
8
9use crate::intermediate_representation::{PropDef, TypeRef};
10
11pub(crate) enum ErrorKind {
12    InvalidKey {
13        key_type: TypeRef,
14        in_use: BTreeSet<String>,
15    },
16    InvalidPropKey {
17        valid: BTreeSet<String>,
18        in_use: BTreeSet<String>,
19    },
20    InvalidValue {
21        value_type: TypeRef,
22    },
23    InvalidNestedValue {
24        prop_name: String,
25        prop_type: TypeRef,
26    },
27    TypeMismatch {
28        value_type: TypeRef,
29    },
30}
31
32impl ErrorKind {
33    pub(crate) fn invalid_key(type_ref: &TypeRef, map: &Map<String, Value>) -> Self {
34        let keys = map.keys().cloned().collect();
35        Self::InvalidKey {
36            key_type: type_ref.clone(),
37            in_use: keys,
38        }
39    }
40
41    pub(crate) fn invalid_value(type_ref: &TypeRef) -> Self {
42        Self::InvalidValue {
43            value_type: type_ref.clone(),
44        }
45    }
46
47    pub(crate) fn invalid_nested_value(prop_name: &str, type_ref: &TypeRef) -> Self {
48        Self::InvalidNestedValue {
49            prop_name: prop_name.to_owned(),
50            prop_type: type_ref.clone(),
51        }
52    }
53
54    pub(crate) fn invalid_prop(props: &[PropDef], map: &Map<String, Value>) -> Self {
55        let keys = map.keys().cloned().collect();
56        let props = props.iter().map(|p| p.name.clone()).collect();
57        Self::InvalidPropKey {
58            valid: props,
59            in_use: keys,
60        }
61    }
62
63    pub(crate) fn type_mismatch(type_ref: &TypeRef) -> Self {
64        Self::TypeMismatch {
65            value_type: type_ref.clone(),
66        }
67    }
68}
69
70impl ErrorKind {
71    pub(crate) fn message(&self, token: &str) -> String {
72        match self {
73            Self::InvalidKey { key_type: t, .. } => match t {
74                TypeRef::String => format!("Invalid key {token}"),
75                _ => format!("Invalid key {token} for type {t}"),
76            },
77            Self::InvalidPropKey { .. } => format!("Invalid property {token}"),
78            Self::InvalidValue { value_type: t } => format!("Invalid value {token} for type {t}"),
79            Self::InvalidNestedValue {
80                prop_name,
81                prop_type: t,
82            } => {
83                format!("A valid value for {prop_name} of type {t} is missing")
84            }
85            Self::TypeMismatch { value_type: t } => format!("Invalid value {token} for type {t}"),
86        }
87    }
88}