Skip to main content

qcs_sdk/grpc/models/
controller.rs

1use pyo3::{
2    prelude::*,
3    types::{PyComplex, PyInt, PyList},
4};
5use qcs_api_client_grpc::models::controller::{
6    readout_values::Values, Complex64, Complex64ReadoutValues, IntegerReadoutValues, ReadoutValues,
7};
8use rigetti_pyo3::{num_complex::Complex32 as NumComplex32, py_wrap_struct};
9use rigetti_pyo3::{py_wrap_data_struct, py_wrap_union_enum, PyTryFrom, ToPython};
10
11py_wrap_data_struct! {
12    PyReadoutValues(ReadoutValues) as "ReadoutValues" {
13        values: Option<Values> => Option<PyReadoutValuesValues>
14    }
15}
16
17py_wrap_union_enum! {
18    PyReadoutValuesValues(Values) as "ReadoutValuesValues" {
19        integer_values: IntegerValues => PyIntegerReadoutValues,
20        complex_values: ComplexValues => PyComplexReadoutValues
21    }
22}
23
24py_wrap_data_struct! {
25    PyIntegerReadoutValues(IntegerReadoutValues) as "IntegerReadoutValues" {
26        values: Vec<i32> => Vec<Py<PyInt>>
27    }
28}
29
30py_wrap_struct! {
31    PyComplexReadoutValues(Complex64ReadoutValues) as "ComplexReadoutValues" {
32        py -> rs {
33            list: Py<PyList> => Complex64ReadoutValues {
34                let list = <Vec<Py<PyComplex>>>::py_try_from(py, &list)?;
35                let values = list.into_iter().map(|complex| {
36                    let complex = NumComplex32::py_try_from(py, &complex)?;
37                    Ok::<_, PyErr>(Complex64 {
38                        real: complex.re,
39                        imaginary: complex.im,
40                    })
41                }).collect::<Result<_, _>>()?;
42
43                Ok::<_, PyErr>(Complex64ReadoutValues { values })
44            }
45        },
46        rs -> py {
47            values: Complex64ReadoutValues => Py<PyList> {
48                let list = values.values.into_iter().map(|complex| {
49                    NumComplex32 {
50                        re: complex.real,
51                        im: complex.imaginary,
52                    }
53                }).collect::<Vec<_>>();
54
55                list.to_python(py)
56            }
57        }
58    }
59}