ligen_python_parser/parser/
mod.rs1use 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 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()) { 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}