use perspective_migrate::{Form, Kind, Migrator};
use pyo3::exceptions::PyValueError;
use pyo3::prelude::*;
use crate::py_err::PyPerspectiveError;
#[pyfunction]
#[pyo3(signature = (kind, config, from_version = None))]
pub fn migrate(
py: Python<'_>,
kind: &str,
config: &Bound<'_, PyAny>,
from_version: Option<&str>,
) -> PyResult<Py<PyAny>> {
let kind: Kind = kind.parse().map_err(PyValueError::new_err)?;
let value: serde_json::Value = pythonize::depythonize(config)?;
let migrated = Migrator::new()
.migrate(kind, from_version, value)
.map_err(|error| PyPerspectiveError::new_err(error.to_string()))?;
let result = serde_json::json!({
"value": migrated.value,
"notices": migrated.notices,
"steps": migrated.steps,
});
Ok(pythonize::pythonize(py, &result)?.unbind())
}
#[pyfunction]
#[pyo3(signature = (kind, config, strict = false))]
pub fn validate(kind: &str, config: &Bound<'_, PyAny>, strict: bool) -> PyResult<()> {
let kind: Kind = kind.parse().map_err(PyValueError::new_err)?;
let form = if strict { Form::Complete } else { Form::Update };
let value: serde_json::Value = pythonize::depythonize(config)?;
perspective_migrate::validate(kind, form, &value)
.map_err(|error| PyPerspectiveError::new_err(error.to_string()))
}