codeclippy 0.0.1

Codeclippy is a utility to scan, map, and search code objects.
Documentation
use std::fmt;

use syn::visit::Visit;

use crate::function_visitor::FunctionCallVisitor;

#[derive(Clone)]
pub struct RustFunction {
    pub visibility: Visibility,
    pub name: String,
    pub inputs: Vec<(String, String)>,
    pub output: Option<String>,
    pub block: Option<Box<syn::Block>>,
    pub functions: Vec<RustFunction>,
    pub instantiated_structs: Vec<String>,
}

impl std::fmt::Debug for RustFunction {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        writeln!(f, "RustFunction {{")?;
        writeln!(f, "  visibility: {:?},", self.visibility)?;
        writeln!(f, "  name: {},", self.name)?;
        writeln!(f, "  inputs: {:?},", self.inputs)?;
        writeln!(f, "  output: {:?},", self.output)?;
        writeln!(f, "  functions: [")?;
        for func in &self.functions {
            writeln!(f, "    {},", func)?;
        }
        writeln!(f, "  ],")?;
        writeln!(
            f,
            "  instantiated_structs: {:?},",
            self.instantiated_structs
        )?;
        write!(f, "}}")
    }
}

impl fmt::Display for RustFunction {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        writeln!(f, "RustFunction {{")?;
        writeln!(f, "  visibility: {:?},", self.visibility)?;
        writeln!(f, "  name: {},", self.name)?;
        writeln!(f, "  inputs: {:?},", self.inputs)?;
        writeln!(f, "  output: {:?},", self.output)?;
        writeln!(f, "  functions: [")?;
        for func in &self.functions {
            writeln!(f, "    {},", func)?;
        }
        writeln!(f, "  ],")?;
        writeln!(
            f,
            "  instantiated_structs: {:?},",
            self.instantiated_structs
        )?;
        write!(f, "}}")
    }
}

impl RustFunction {
    pub fn extract_function_body(&mut self) {
        if let Some(ref block) = self.block {
            let mut body_visitor = FunctionCallVisitor::default();
            body_visitor.visit_block(block); // Pass the dereferenced block

            self.functions.extend(body_visitor.functions);
            self.instantiated_structs
                .extend(body_visitor.instantiated_structs);
        }
    }
}

#[derive(Debug, Clone)]
pub struct RustStruct {
    pub visibility: Visibility,
    pub name: String,
    pub fields: Vec<(String, String)>,
    pub methods: Vec<RustFunction>,
}

#[derive(Debug, Clone)]
pub struct RustEnum {
    pub visibility: Visibility,
    pub name: String,
    pub variants: Vec<(String, Vec<String>)>,
    pub methods: Vec<RustFunction>,
}

#[derive(Debug, Clone)]
pub struct RustTrait {
    pub visibility: Visibility,
    pub name: String,
    pub methods: Vec<RustFunction>,
    pub implementors: Vec<String>,
}

#[derive(Debug, Clone)]
pub struct RustImpl {
    pub for_type: String,
    pub functions: Vec<RustFunction>,
}

impl fmt::Display for RustStruct {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        writeln!(f, "RustStruct {{")?;
        writeln!(f, "  visibility: {:?},", self.visibility)?;
        writeln!(f, "  name: {},", self.name)?;
        writeln!(f, "  fields: {:?},", self.fields)?;
        writeln!(f, "  methods: [")?;
        for method in &self.methods {
            writeln!(f, "    {},", method)?;
        }
        writeln!(f, "  ],")?;
        write!(f, "}}")
    }
}

#[derive(Debug, Clone, PartialEq)]
pub enum Visibility {
    Public,
    Restricted,
    Inherited,
}