protospec_build/semantics/
error.rs

1use 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}