ligen_python_parser/parser/
mod.rs

1use crate::module::SubPath;
2use crate::prelude::*;
3use crate::object::ObjectParser;
4use crate::function::FunctionParser;
5use crate::identifier::IdentifierParser;
6use crate::types::type_definition::TypeDefinitionParser;
7
8pub mod metadata;
9pub mod config;
10pub mod validator;
11
12pub use config::*;
13pub use metadata::*;
14pub use validator::*;
15
16use ligen::ir::{Registry, Library};
17use ligen::parser::ParserConfig;
18
19#[derive(Default)]
20pub struct PythonParser {
21    pub identifier_parser: IdentifierParser,
22    pub function_parser: FunctionParser,
23    pub type_definition_parser: TypeDefinitionParser,
24    pub metadata_parser: MetadataParser,
25    pub object_parser: ObjectParser,
26    pub validator: LibraryValidator
27}
28
29impl PythonParser {
30    pub fn new() -> Self {
31        Default::default()
32    }
33}
34
35impl PythonParser {
36    fn parse_library(&self, input: &std::path::Path, config: &ParserConfig) -> Result<Library> {
37        // This line replaces "-" with "_" in the file name
38        let input = input.with_file_name(input.file_name().unwrap().to_string_lossy().replace('-', "_").as_str().trim());
39        let input = input.as_path();
40        let identifier = self.identifier_parser.parse(input, config)?;
41        let metadata = self.metadata_parser.parse(input, config)?;
42        let root_module = self.parse(SubPath(input), config)?;
43        let mut library = Library { identifier, metadata, root_module };
44        self.validator.validate(&mut library, config)?;
45        Ok(library)
46    }
47}
48
49impl Parser<&std::path::Path> for PythonParser {
50    type Output = Registry;
51    fn parse(&self, input: &std::path::Path, config: &ParserConfig) -> Result<Self::Output> {
52        let mut registry = Registry::new();
53        let library = self.parse_library(input, config)?;
54        for dependency in library.metadata.dependencies.iter().filter(|dependency| dependency.feature.is_none()) { // TODO: We need to support features.
55            let dependency_path = input.parent().unwrap().join(dependency.identifier.to_string());
56            let mut dependency_library = self.parse(dependency_path.as_path(), config)?;
57            registry.libraries.append(&mut dependency_library.libraries);
58        }
59        registry.libraries.push(library);
60        Ok(registry)
61    }
62    fn name(&self) -> &str {
63        "Python"
64    }
65    fn config(&self) -> ParserConfig {
66        PythonParserConfig::default().into()
67    }
68}