use pyo3::prelude::*;
use pyo3::types::PyBytes;
#[pyclass(name = "SigningCertificateBuilder")]
pub struct PySigningCertificateBuilder {
inner: synta_certificate::SigningCertificateBuilder,
built: bool,
}
#[pymethods]
impl PySigningCertificateBuilder {
#[new]
fn new() -> Self {
Self {
inner: synta_certificate::SigningCertificateBuilder::new(),
built: false,
}
}
fn add_cert_id<'py>(
slf: Bound<'py, Self>,
cert_hash: &[u8],
issuer_serial_der: Option<&[u8]>,
) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::SigningCertificateBuilder::new(),
);
guard.inner = old.add_cert_id(cert_hash, issuer_serial_der);
}
slf
}
fn add_policy<'py>(slf: Bound<'py, Self>, policy_oid: Vec<u32>) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::SigningCertificateBuilder::new(),
);
guard.inner = old.add_policy(&policy_oid);
}
slf
}
fn build<'py>(&mut self, py: Python<'py>) -> PyResult<Bound<'py, PyBytes>> {
if self.built {
return Err(pyo3::exceptions::PyValueError::new_err(
"build() has already been called; create a new builder",
));
}
self.built = true;
let inner = std::mem::replace(
&mut self.inner,
synta_certificate::SigningCertificateBuilder::new(),
);
let der = inner
.build()
.map_err(pyo3::exceptions::PyValueError::new_err)?;
Ok(PyBytes::new(py, &der))
}
fn __repr__(&self) -> String {
"SigningCertificateBuilder()".to_string()
}
}
#[pyclass(name = "ReceiptRequestBuilder")]
pub struct PyReceiptRequestBuilder {
inner: synta_certificate::ReceiptRequestBuilder,
built: bool,
}
#[pymethods]
impl PyReceiptRequestBuilder {
#[new]
fn new() -> Self {
Self {
inner: synta_certificate::ReceiptRequestBuilder::new(),
built: false,
}
}
fn signed_content_identifier<'py>(slf: Bound<'py, Self>, id: &[u8]) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
guard.inner = old.signed_content_identifier(id);
}
slf
}
fn receipts_from_all<'py>(slf: Bound<'py, Self>) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
guard.inner = old.receipts_from_all();
}
slf
}
fn receipts_from_first_tier<'py>(slf: Bound<'py, Self>) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
guard.inner = old.receipts_from_first_tier();
}
slf
}
fn add_receipt_to_email<'py>(slf: Bound<'py, Self>, email: &str) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
guard.inner = old.add_receipt_to_email(email);
}
slf
}
fn add_receipt_to_raw<'py>(
slf: Bound<'py, Self>,
general_names_der: &[u8],
) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
guard.inner = old.add_receipt_to_raw(general_names_der);
}
slf
}
fn build<'py>(&mut self, py: Python<'py>) -> PyResult<Bound<'py, PyBytes>> {
if self.built {
return Err(pyo3::exceptions::PyValueError::new_err(
"build() has already been called; create a new builder",
));
}
self.built = true;
let inner = std::mem::replace(
&mut self.inner,
synta_certificate::ReceiptRequestBuilder::new(),
);
let der = inner
.build()
.map_err(pyo3::exceptions::PyValueError::new_err)?;
Ok(PyBytes::new(py, &der))
}
fn __repr__(&self) -> String {
"ReceiptRequestBuilder()".to_string()
}
}
#[pyclass(name = "ESSSecurityLabelBuilder")]
pub struct PyESSSecurityLabelBuilder {
inner: synta_certificate::ESSSecurityLabelBuilder,
built: bool,
}
#[pymethods]
impl PyESSSecurityLabelBuilder {
#[new]
fn new() -> Self {
Self {
inner: synta_certificate::ESSSecurityLabelBuilder::new(),
built: false,
}
}
fn security_policy<'py>(slf: Bound<'py, Self>, policy_oid: Vec<u32>) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
guard.inner = old.security_policy(&policy_oid);
}
slf
}
fn classification<'py>(slf: Bound<'py, Self>, value: u16) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
guard.inner = old.classification(value);
}
slf
}
fn privacy_mark_utf8<'py>(slf: Bound<'py, Self>, mark: &str) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
guard.inner = old.privacy_mark_utf8(mark);
}
slf
}
fn privacy_mark_printable<'py>(slf: Bound<'py, Self>, mark: &str) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
guard.inner = old.privacy_mark_printable(mark);
}
slf
}
fn add_security_category_raw<'py>(
slf: Bound<'py, Self>,
security_category_der: &[u8],
) -> Bound<'py, Self> {
{
let mut guard = slf.borrow_mut();
let old = std::mem::replace(
&mut guard.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
guard.inner = old.add_security_category_raw(security_category_der);
}
slf
}
fn build<'py>(&mut self, py: Python<'py>) -> PyResult<Bound<'py, PyBytes>> {
if self.built {
return Err(pyo3::exceptions::PyValueError::new_err(
"build() has already been called; create a new builder",
));
}
self.built = true;
let inner = std::mem::replace(
&mut self.inner,
synta_certificate::ESSSecurityLabelBuilder::new(),
);
let der = inner
.build()
.map_err(pyo3::exceptions::PyValueError::new_err)?;
Ok(PyBytes::new(py, &der))
}
fn __repr__(&self) -> String {
"ESSSecurityLabelBuilder()".to_string()
}
}
pub(super) fn register_ess_classes(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PySigningCertificateBuilder>()?;
m.add_class::<PyReceiptRequestBuilder>()?;
m.add_class::<PyESSSecurityLabelBuilder>()?;
Ok(())
}