use crate::aaml::AAML;
use crate::error::AamlError;
use pyo3::exceptions::PyRuntimeError;
use pyo3::prelude::*;
use std::collections::HashMap;
fn to_py(err: AamlError) -> PyErr {
PyRuntimeError::new_err(err.to_string())
}
#[pyclass(unsendable, name = "AAML")]
pub struct PyAAML {
inner: AAML,
}
#[pymethods]
impl PyAAML {
#[new]
fn new() -> Self {
PyAAML { inner: AAML::new() }
}
#[staticmethod]
fn parse(content: &str) -> PyResult<Self> {
AAML::parse(content)
.map(|inner| PyAAML { inner })
.map_err(to_py)
}
#[staticmethod]
fn load(path: &str) -> PyResult<Self> {
AAML::load(path)
.map(|inner| PyAAML { inner })
.map_err(to_py)
}
fn merge_content(&mut self, content: &str) -> PyResult<()> {
self.inner.merge_content(content).map_err(to_py)
}
fn merge_file(&mut self, path: &str) -> PyResult<()> {
self.inner.merge_file(path).map_err(to_py)
}
fn find_obj(&self, key: &str) -> Option<String> {
self.inner.find_obj(key).map(|v| v.as_str().to_string())
}
fn find_key(&self, value: &str) -> Option<String> {
self.inner.find_key(value).map(|v| v.as_str().to_string())
}
fn find_deep(&self, key: &str) -> Option<String> {
self.inner.find_deep(key).map(|v| v.as_str().to_string())
}
fn find_list(&self, key: &str) -> Option<Vec<String>> {
self.inner.find_obj(key).and_then(|v| v.as_list())
}
fn find_object(&self, key: &str) -> Option<HashMap<String, String>> {
self.inner.find_obj(key).and_then(|v| v.as_object())
}
fn keys(&self) -> Vec<String> {
self.inner.keys().iter().map(|s| s.to_string()).collect()
}
fn to_dict(&self) -> HashMap<String, String> {
self.inner.to_map()
}
fn validate_value(&self, type_name: &str, value: &str) -> PyResult<()> {
self.inner.validate_value(type_name, value).map_err(to_py)
}
fn __repr__(&self) -> String {
format!("AAML({} keys)", self.inner.keys().len())
}
fn __len__(&self) -> usize {
self.inner.keys().len()
}
fn __contains__(&self, key: &str) -> bool {
self.inner.find_obj(key).is_some()
}
fn __getitem__(&self, key: &str) -> PyResult<String> {
self.inner
.find_obj(key)
.map(|v| v.as_str().to_string())
.ok_or_else(|| PyRuntimeError::new_err(format!("Key not found: '{key}'")))
}
}
pub fn register(m: &pyo3::Bound<'_, pyo3::types::PyModule>) -> pyo3::PyResult<()> {
m.add_class::<PyAAML>()?;
m.add("__version__", env!("CARGO_PKG_VERSION"))?;
Ok(())
}