use std::any::Any;
use std::ops::Deref;
use std::sync::Arc;
use cairo_lang_syntax::node::ast;
use cairo_lang_syntax::node::db::SyntaxGroup;
use cairo_lang_syntax::node::ids::SyntaxStablePtrId;
use smol_str::SmolStr;
pub trait GeneratedFileAuxData: std::fmt::Debug + Sync + Send {
fn as_any(&self) -> &dyn Any;
fn eq(&self, other: &dyn GeneratedFileAuxData) -> bool;
}
#[derive(Clone, Debug)]
pub struct DynGeneratedFileAuxData(pub Arc<dyn GeneratedFileAuxData>);
impl DynGeneratedFileAuxData {
pub fn new<T: GeneratedFileAuxData + 'static>(aux_data: T) -> Self {
DynGeneratedFileAuxData(Arc::new(aux_data))
}
}
impl Deref for DynGeneratedFileAuxData {
type Target = Arc<dyn GeneratedFileAuxData>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl PartialEq for DynGeneratedFileAuxData {
fn eq(&self, that: &DynGeneratedFileAuxData) -> bool {
GeneratedFileAuxData::eq(&*self.0, &*that.0)
}
}
impl Eq for DynGeneratedFileAuxData {}
pub struct PluginGeneratedFile {
pub name: SmolStr,
pub content: String,
pub aux_data: DynGeneratedFileAuxData,
}
#[derive(Default)]
pub struct PluginResult {
pub code: Option<PluginGeneratedFile>,
pub diagnostics: Vec<PluginDiagnostic>,
pub remove_original_item: bool,
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct PluginDiagnostic {
pub stable_ptr: SyntaxStablePtrId,
pub message: String,
}
pub trait MacroPlugin: std::fmt::Debug + Sync + Send {
fn generate_code(&self, db: &dyn SyntaxGroup, item_ast: ast::Item) -> PluginResult;
}