#![cfg_attr(coverage_nightly, coverage(off))]
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ProjectContext {
pub project_type: String,
pub files: Vec<FileContext>,
pub summary: ProjectSummary,
#[serde(skip)]
pub graph: Option<crate::services::context_graph::ProjectContextGraph>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ProjectSummary {
pub total_files: usize,
pub total_functions: usize,
pub total_structs: usize,
pub total_enums: usize,
pub total_traits: usize,
pub total_impls: usize,
pub dependencies: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct FileContext {
pub path: String,
pub language: String,
pub items: Vec<AstItem>,
#[serde(skip_serializing_if = "Option::is_none")]
pub complexity_metrics: Option<crate::services::complexity::FileComplexityMetrics>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(tag = "type")]
#[derive(PartialEq)]
pub enum AstItem {
Function {
name: String,
visibility: String,
is_async: bool,
line: usize,
},
Struct {
name: String,
visibility: String,
fields_count: usize,
derives: Vec<String>,
line: usize,
},
Enum {
name: String,
visibility: String,
variants_count: usize,
line: usize,
},
Trait {
name: String,
visibility: String,
line: usize,
},
Impl {
type_name: String,
trait_name: Option<String>,
line: usize,
},
Module {
name: String,
visibility: String,
line: usize,
},
Use {
path: String,
line: usize,
},
Import {
module: String,
items: Vec<String>,
alias: Option<String>,
line: usize,
},
}
impl AstItem {
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn display_name(&self) -> &str {
match self {
AstItem::Function { name, .. } => name,
AstItem::Struct { name, .. } => name,
AstItem::Enum { name, .. } => name,
AstItem::Trait { name, .. } => name,
AstItem::Impl { type_name, .. } => type_name,
AstItem::Module { name, .. } => name,
AstItem::Use { path, .. } => path,
AstItem::Import { module, .. } => module,
}
}
}
pub(crate) struct GroupedItems<'a> {
pub functions: Vec<&'a AstItem>,
pub structs: Vec<&'a AstItem>,
pub enums: Vec<&'a AstItem>,
pub traits: Vec<&'a AstItem>,
pub impls: Vec<&'a AstItem>,
pub modules: Vec<&'a AstItem>,
}
impl<'a> GroupedItems<'a> {
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new() -> Self {
Self {
functions: Vec::new(),
structs: Vec::new(),
enums: Vec::new(),
traits: Vec::new(),
impls: Vec::new(),
modules: Vec::new(),
}
}
}