use pyo3::exceptions::PyValueError;
use pyo3::prelude::*;
use pyo3::types::PyBytes;
use synta_certificate::NameBuilder;
#[pyclass(name = "NameBuilder")]
pub struct PyNameBuilder {
inner: NameBuilder,
}
#[pymethods]
impl PyNameBuilder {
#[new]
fn new() -> Self {
Self {
inner: NameBuilder::new(),
}
}
fn add_attr<'py>(slf: Bound<'py, Self>, oid: &str, value: &str) -> PyResult<Bound<'py, Self>> {
use std::str::FromStr;
let parsed = synta::ObjectIdentifier::from_str(oid)
.map_err(|_| PyValueError::new_err(format!("invalid OID: {oid}")))?;
let comps = parsed.components().to_vec();
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.add_attr(&comps, value);
Ok(slf)
}
fn common_name<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.common_name(value);
slf
}
fn organization<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.organization(value);
slf
}
fn organizational_unit<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.organizational_unit(value);
slf
}
fn country<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.country(value);
slf
}
fn state<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.state(value);
slf
}
fn locality<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.locality(value);
slf
}
fn street<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.street(value);
slf
}
fn email_address<'py>(slf: Bound<'py, Self>, value: &str) -> Bound<'py, Self> {
let old = std::mem::replace(&mut slf.borrow_mut().inner, NameBuilder::new());
slf.borrow_mut().inner = old.email_address(value);
slf
}
fn build<'py>(&self, py: Python<'py>) -> PyResult<Bound<'py, PyBytes>> {
let der = self
.inner
.build()
.map_err(pyo3::exceptions::PyValueError::new_err)?;
Ok(PyBytes::new(py, &der))
}
fn __repr__(&self) -> String {
"NameBuilder()".to_string()
}
}