nimbus_fml/editing/
error_kind.rs
1use 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}