rustpython_vm/
byte.rs

1//! byte operation APIs
2use crate::object::AsObject;
3use crate::{PyObject, PyResult, VirtualMachine};
4use num_traits::ToPrimitive;
5
6pub fn bytes_from_object(vm: &VirtualMachine, obj: &PyObject) -> PyResult<Vec<u8>> {
7    if let Ok(elements) = obj.try_bytes_like(vm, |bytes| bytes.to_vec()) {
8        return Ok(elements);
9    }
10
11    if !obj.fast_isinstance(vm.ctx.types.str_type) {
12        if let Ok(elements) = vm.map_iterable_object(obj, |x| value_from_object(vm, &x)) {
13            return elements;
14        }
15    }
16
17    Err(vm.new_type_error(
18        "can assign only bytes, buffers, or iterables of ints in range(0, 256)".to_owned(),
19    ))
20}
21
22pub fn value_from_object(vm: &VirtualMachine, obj: &PyObject) -> PyResult<u8> {
23    obj.try_index(vm)?
24        .as_bigint()
25        .to_u8()
26        .ok_or_else(|| vm.new_value_error("byte must be in range(0, 256)".to_owned()))
27}