#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Span {
pub start: usize,
pub end: usize,
pub line: u32,
pub column: u32,
pub end_line: u32,
pub end_column: u32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GraphqlOperation {
Query,
Mutation,
Subscription,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GraphqlType {
Object,
Interface,
Input,
Enum,
Scalar,
Union,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum ContractKind {
GraphqlType(GraphqlType),
GraphqlField {
operation: Option<GraphqlOperation>,
return_type: String,
},
GraphqlOperation(GraphqlOperation),
GraphqlCall(GraphqlOperation),
GraphqlFragment {
on_type: String,
operation: Option<GraphqlOperation>,
},
GraphqlFragmentSpread,
ProtobufPackage,
ProtobufMessage,
ProtobufEnum,
ProtobufService,
ProtobufRpc {
input: String,
output: String,
client_streaming: bool,
server_streaming: bool,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Contract {
pub name: String,
pub kind: ContractKind,
pub span: Span,
pub owner: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseDiagnostic {
pub code: &'static str,
pub message: String,
pub span: Span,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum DeclarationKind {
Function,
Method,
Class,
Interface,
Enum,
TypeAlias,
Field,
Constant,
Variable,
Module,
Struct,
Trait,
Table,
View,
Procedure,
Selector,
Resource,
Heading,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct Declaration {
pub name: String,
pub kind: DeclarationKind,
pub span: Span,
pub owner: Option<String>,
pub exported: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ImportBinding {
pub imported: String,
pub local: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Import {
pub specifier: String,
pub span: Span,
pub type_only: bool,
pub reexport: bool,
pub names: Vec<String>,
pub bindings: Vec<ImportBinding>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum ReferenceKind {
Call,
Inherits,
Implements,
Uses,
Reads,
Writes,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Reference {
pub name: String,
pub kind: ReferenceKind,
pub receiver: Option<String>,
pub span: Span,
pub owner: Option<String>,
pub string_arguments: Vec<String>,
pub name_arguments: Vec<String>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct Facts {
pub declarations: Vec<Declaration>,
pub test_only_declarations: Vec<Span>,
pub imports: Vec<Import>,
pub references: Vec<Reference>,
pub contracts: Vec<Contract>,
pub diagnostics: Vec<ParseDiagnostic>,
}
impl Facts {
#[must_use]
pub fn declaration_is_test_only(&self, span: Span) -> bool {
self.test_only_declarations.contains(&span)
}
pub fn calls(&self) -> impl Iterator<Item = &Reference> {
self.references
.iter()
.filter(|reference| reference.kind == ReferenceKind::Call)
}
}