|
#[pyclass(module = "_io", name, no_attr)] |
|
#[derive(Debug, PyPayload)] |
|
struct StatelessIncrementalEncoder { |
|
encode: PyObjectRef, |
|
errors: Option<PyStrRef>, |
|
name: Option<PyStrRef>, |
|
} |
|
|
|
#[pyclass] |
|
impl StatelessIncrementalEncoder { |
|
#[pymethod] |
|
fn encode( |
|
&self, |
|
input: PyObjectRef, |
|
_final: OptionalArg<bool>, |
|
vm: &VirtualMachine, |
|
) -> PyResult { |
|
let mut args: Vec<PyObjectRef> = vec![input]; |
|
if let Some(errors) = &self.errors { |
|
args.push(errors.to_owned().into()); |
|
} |
|
let res = self.encode.call(args, vm)?; |
|
let tuple: PyTupleRef = res.try_into_value(vm)?; |
|
if tuple.len() != 2 { |
|
return Err(vm.new_type_error("encoder must return a tuple (object, integer)")); |
|
} |
|
Ok(tuple[0].clone()) |
|
} |
|
|
|
#[pymethod] |
|
fn reset(&self) {} |
|
|
|
#[pymethod] |
|
fn setstate(&self, _state: PyObjectRef) {} |
|
|
|
#[pymethod] |
|
fn getstate(&self, vm: &VirtualMachine) -> PyObjectRef { |
|
vm.ctx.new_int(0).into() |
|
} |
|
|
|
#[pygetset] |
|
fn name(&self) -> Option<PyStrRef> { |
|
self.name.clone() |
|
} |
|
#[pyclass(module = "_io", name, no_attr)] |
|
#[derive(Debug, PyPayload)] |
|
struct StatelessIncrementalEncoder { |
|
encode: PyObjectRef, |
|
errors: Option<PyStrRef>, |
|
name: Option<PyStrRef>, |
|
} |
|
|
|
#[pyclass] |
|
impl StatelessIncrementalEncoder { |
|
#[pymethod] |
|
fn encode( |
|
&self, |
|
input: PyObjectRef, |
|
_final: OptionalArg<bool>, |
|
vm: &VirtualMachine, |
|
) -> PyResult { |
|
let mut args: Vec<PyObjectRef> = vec![input]; |
|
if let Some(errors) = &self.errors { |
|
args.push(errors.to_owned().into()); |
|
} |
|
let res = self.encode.call(args, vm)?; |
|
let tuple: PyTupleRef = res.try_into_value(vm)?; |
|
if tuple.len() != 2 { |
|
return Err(vm.new_type_error("encoder must return a tuple (object, integer)")); |
|
} |
|
let _consumed: isize = isize::try_from_object(vm, tuple[1].clone()).map_err(|_| { |
|
vm.new_type_error("encoder must return a tuple (object, integer)") |
|
})?; |
|
Ok(tuple[0].clone()) |
|
} |
|
|
|
#[pymethod] |
|
fn reset(&self) {} |
|
|
|
#[pymethod] |
|
fn setstate(&self, _state: PyObjectRef) {} |
|
|
|
#[pymethod] |
|
fn getstate(&self, vm: &VirtualMachine) -> PyObjectRef { |
|
vm.ctx.new_int(0).into() |
|
} |
|
|
|
#[pygetset] |
|
fn name(&self) -> Option<PyStrRef> { |
|
self.name.clone() |
|
} |