1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use pyo3::prelude::*;
use pyo3::types::PyDict;

pub struct Transport(PyObject);

impl Transport {
    pub fn new(obj: PyObject) -> Self {
        Transport(obj)
    }
}

impl FromPyObject<'_> for Transport {
    fn extract(obj: &PyAny) -> PyResult<Self> {
        Ok(Transport(obj.to_object(obj.py())))
    }
}

impl ToPyObject for Transport {
    fn to_object(&self, py: Python) -> PyObject {
        self.0.to_object(py)
    }
}

pub fn get_transport(url: &url::Url, possible_transports: Option<Vec<Transport>>) -> Transport {
    pyo3::Python::with_gil(|py| {
        let urlutils = py.import("breezy.transport").unwrap();
        let kwargs = PyDict::new(py);
        kwargs
            .set_item(
                "possible_transports",
                possible_transports.map(|t| t.into_iter().map(|t| t.0).collect::<Vec<PyObject>>()),
            )
            .unwrap();
        let o = urlutils
            .call_method("get_transport", (url.to_string(),), Some(kwargs))
            .unwrap();
        Transport(o.to_object(py))
    })
}