comfy-builder-core 0.0.2

A system for building custom nodes for ComfyUI in Rust.
Documentation
use pyo3::prelude::PyModule;
use pyo3::types::{PyDict, PyDictMethods, PyModuleMethods};
use pyo3::{Bound, PyClass, PyResult, Python};

pub trait Registerable: PyClass {}

#[derive(Debug)]
pub struct NodeRegistration {
    inner: fn(
        python: Python,
        module: &Bound<PyModule>,
        class: &Bound<PyDict>,
        display: &Bound<PyDict>,
    ) -> PyResult<()>,
}

impl NodeRegistration {
    pub const fn new<T: Registerable>() -> Self {
        Self {
            inner: |python, module, class, display| {
                module.add_class::<T>()?;

                let type_name = std::any::type_name::<T>();
                let class_name = type_name.split("::").last().unwrap_or(type_name);

                class.set_item(class_name, python.get_type::<T>())?;
                display.set_item(class_name, class_name)?;

                Ok(())
            },
        }
    }

    pub fn register(
        &self,
        python: Python,
        module: &Bound<PyModule>,
        class: &Bound<PyDict>,
        display: &Bound<PyDict>,
    ) -> PyResult<()> {
        (self.inner)(python, module, class, display)
    }
}

inventory::collect!(NodeRegistration);