use perspective_migrate::{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 = match kind {
"view" => Kind::View,
"viewer" => Kind::Viewer,
"workspace" => Kind::Workspace,
_ => {
return Err(PyValueError::new_err(format!(
"Unknown config kind `{kind}`; expected `view`, `viewer` or `workspace`"
)));
},
};
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())
}