use lerna::search_path::{
ConfigSearchPath as RustConfigSearchPath, SearchPathElement as RustSearchPathElement,
SearchPathQuery as RustSearchPathQuery,
};
use pyo3::prelude::*;
#[pyclass(name = "SearchPathElement")]
#[derive(Clone)]
pub struct PySearchPathElement {
inner: RustSearchPathElement,
}
#[pymethods]
impl PySearchPathElement {
#[new]
fn new(provider: String, path: String) -> Self {
Self {
inner: RustSearchPathElement::new(provider, path),
}
}
#[getter]
fn provider(&self) -> String {
self.inner.provider.clone()
}
#[setter]
fn set_provider(&mut self, value: String) {
self.inner.provider = value;
}
#[getter]
fn path(&self) -> String {
self.inner.path.clone()
}
#[setter]
fn set_path(&mut self, value: String) {
self.inner.path = value;
}
fn scheme(&self) -> Option<String> {
self.inner.scheme().map(|s| s.to_string())
}
fn path_without_scheme(&self) -> String {
self.inner.path_without_scheme().to_string()
}
fn __repr__(&self) -> String {
format!(
"SearchPathElement(provider={}, path={})",
self.inner.provider, self.inner.path
)
}
fn __str__(&self) -> String {
format!("provider={}, path={}", self.inner.provider, self.inner.path)
}
}
#[pyclass(name = "SearchPathQuery")]
#[derive(Clone)]
pub struct PySearchPathQuery {
inner: RustSearchPathQuery,
}
#[pymethods]
impl PySearchPathQuery {
#[new]
#[pyo3(signature = (provider=None, path=None))]
fn new(provider: Option<String>, path: Option<String>) -> Self {
Self {
inner: RustSearchPathQuery { provider, path },
}
}
#[staticmethod]
fn by_provider(provider: String) -> Self {
Self {
inner: RustSearchPathQuery::by_provider(provider),
}
}
#[staticmethod]
fn by_path(path: String) -> Self {
Self {
inner: RustSearchPathQuery::by_path(path),
}
}
#[staticmethod]
fn by_both(provider: String, path: String) -> Self {
Self {
inner: RustSearchPathQuery::by_both(provider, path),
}
}
#[getter]
fn provider(&self) -> Option<String> {
self.inner.provider.clone()
}
#[setter]
fn set_provider(&mut self, value: Option<String>) {
self.inner.provider = value;
}
#[getter]
fn path(&self) -> Option<String> {
self.inner.path.clone()
}
#[setter]
fn set_path(&mut self, value: Option<String>) {
self.inner.path = value;
}
fn matches(&self, element: &PySearchPathElement) -> bool {
self.inner.matches(&element.inner)
}
fn __repr__(&self) -> String {
format!(
"SearchPathQuery(provider={:?}, path={:?})",
self.inner.provider, self.inner.path
)
}
}
#[pyclass(name = "RustConfigSearchPath")]
#[derive(Clone)]
pub struct PyConfigSearchPath {
inner: RustConfigSearchPath,
}
#[pymethods]
impl PyConfigSearchPath {
#[new]
fn new() -> Self {
Self {
inner: RustConfigSearchPath::new(),
}
}
#[staticmethod]
fn from_tuples(tuples: Vec<(String, String)>) -> Self {
let elements: Vec<RustSearchPathElement> = tuples
.into_iter()
.map(|(p, path)| RustSearchPathElement::new(p, path))
.collect();
Self {
inner: RustConfigSearchPath::from_elements(elements),
}
}
fn __len__(&self) -> usize {
self.inner.len()
}
fn is_empty(&self) -> bool {
self.inner.is_empty()
}
fn get_path(&self) -> Vec<PySearchPathElement> {
self.inner
.get_path()
.iter()
.map(|e| PySearchPathElement { inner: e.clone() })
.collect()
}
fn get(&self, index: usize) -> Option<PySearchPathElement> {
self.inner
.get(index)
.map(|e| PySearchPathElement { inner: e.clone() })
}
fn find_first_match(&self, query: &PySearchPathQuery) -> i32 {
self.inner.find_first_match(&query.inner)
}
fn find_last_match(&self, query: &PySearchPathQuery) -> i32 {
self.inner.find_last_match(&query.inner)
}
fn append(&mut self, provider: String, path: String) {
self.inner.append(provider, path);
}
fn append_after(&mut self, provider: String, path: String, anchor: &PySearchPathQuery) {
self.inner.append_after(provider, path, &anchor.inner);
}
fn prepend(&mut self, provider: String, path: String) {
self.inner.prepend(provider, path);
}
fn prepend_before(&mut self, provider: String, path: String, anchor: &PySearchPathQuery) {
self.inner.prepend_before(provider, path, &anchor.inner);
}
fn remove(&mut self, query: &PySearchPathQuery) -> usize {
self.inner.remove(&query.inner)
}
fn clear(&mut self) {
self.inner.clear();
}
fn contains(&self, query: &PySearchPathQuery) -> bool {
self.inner.contains(&query.inner)
}
fn __repr__(&self) -> String {
format!("RustConfigSearchPath(len={})", self.inner.len())
}
fn __str__(&self) -> String {
format!("{}", self.inner)
}
}
pub fn register(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PySearchPathElement>()?;
m.add_class::<PySearchPathQuery>()?;
m.add_class::<PyConfigSearchPath>()?;
Ok(())
}