protospec_build/semantics/
error.rs1use std::fmt;
2
3use crate::{result::*, Span};
4use thiserror::Error;
5
6pub type AsgResult<T> = StdResult<T, AsgError>;
7
8#[derive(Error)]
9pub enum AsgError {
10 #[error("unresolved ffi import '{0}' @ {1}")]
11 FfiMissing(String, Span),
12 #[error("unresolved import '{0}' @ {1}")]
13 ImportMissing(String, Span),
14 #[error("unresolved import item '{0}' does not exist in module {1} @ {2}")]
15 ImportUnresolved(String, String, Span),
16 #[error("failed to parse import file '{0}' @ {1}: {2}")]
17 ImportParse(String, Span, crate::parser::ParseError),
18 #[error("type name already in use: '{0}' @ {1}, originally declared at {2}")]
19 TypeRedefinition(String, Span, Span),
20 #[error("transform name already in use: '{0}' @ {1}, originally declared at {2}")]
21 TransformRedefinition(String, Span, Span),
22 #[error("function name already in use: '{0}' @ {1}, originally declared at {2}")]
23 FunctionRedefinition(String, Span, Span),
24 #[error("const name already in use: '{0}' @ {1}, originally declared at {2}")]
25 ConstRedefinition(String, Span, Span),
26 #[error("const cannot declare complex type: '{0}' @ {1}")]
27 ConstTypeDefinition(String, Span),
28 #[error("cast cannot declare complex type @ {0}")]
29 CastTypeDefinition(Span),
30 #[error("complex types cannot be declared in this context @ {0}")]
31 IllegalComplexTypeDefinition(Span),
32 #[error("enum variant name already in use: '{0}' @ {1}, originally declared at {2}")]
33 EnumVariantRedefinition(String, Span, Span),
34 #[error("bitfield flag name already in use: '{0}' @ {1}, originally declared at {2}")]
35 BitfieldFlagRedefinition(String, Span, Span),
36 #[error("container field name already in use: '{0}' @ {1}, originally declared at {2}")]
37 ContainerFieldRedefinition(String, Span, Span),
38 #[error("referenced type '{0}' @ {1} not found")]
39 UnresolvedType(String, Span),
40 #[error("referenced variable '{0}' @ {1} not found")]
41 UnresolvedVar(String, Span),
42 #[error("referenced transform '{0}' @ {1} not found")]
43 UnresolvedTransform(String, Span),
44 #[error("referenced function '{0}' @ {1} not found")]
45 UnresolvedFunction(String, Span),
46 #[error("referenced transform '{0}' @ {1} cannot encode type {2}")]
47 InvalidTransformInput(String, Span, String),
48 #[error("referenced transform '{0}' @ {1} cannot cannot have condition because its target encoding type is not assignable to its input encoding type: {2} != {3}")]
49 InvalidTransformCondition(String, Span, String, String),
50 #[error("unexpected type got {0}, expected {1} @ {2}")]
51 UnexpectedType(String, String, Span),
52 #[error("illegal cast, cannot cast from {0} to {1} @ {2}")]
53 IllegalCast(String, String, Span),
54 #[error("reference enum variant for enum {0}, {1} @ {2} is not a valid variant")]
55 UnresolvedEnumVariant(String, String, Span),
56 #[error("could not infer type @ {0} (try adding more explicit types)")]
57 UninferredType(Span),
58 #[error("could not parse int {0} @ {1} @ {1}")]
59 InvalidInt(String, Span),
60 #[error("invalid number of arguments for ffi, expected {0} to {1} arguments, got {2} @ {3}")]
61 InvalidFFIArgumentCount(usize, usize, usize, Span),
62 #[error("invalid number of arguments for type, expected {0} to {1} arguments, got {2} @ {3}")]
63 InvalidTypeArgumentCount(usize, usize, usize, Span),
64 #[error("cannot have required arguments after optional arguments for type @ {0}")]
65 InvalidTypeArgumentOrder(Span),
66 #[error("illegal repitition of container, enum, or bitfield -- outline the container/enum as a top level type declaration @ {0}")]
67 InlineRepetition(Span),
68 #[error("invalid or unknown flag '{0}' @ {1}")]
69 InvalidFlag(String, Span),
70 #[error("enum containers must be top level @ {0}")]
71 EnumContainerMustBeToplevel(Span),
72 #[error("cannot have field after unconditional field in enum container @ {0}")]
73 EnumContainerFieldAfterUnconditional(Span),
74 #[error("cannot have pad in enum container @ {0}")]
75 EnumContainerPad(Span),
76 #[error("type `{0}` does not implement auto receiving @ {1}")]
77 TypeNotAutoCompatible(String, Span),
78 #[error("referenced bitfield member `{0}` does not exist @ {1}")]
79 BitfieldMemberUndefined(String, Span),
80 #[error("unknown: {0}")]
81 Unknown(#[from] crate::Error),
82}
83
84impl fmt::Debug for AsgError {
85 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
86 write!(f, "{}", self)
87 }
88}