// yt - A fully featured command line YouTube client // // Copyright (C) 2025 Benedikt Peetz // SPDX-License-Identifier: GPL-3.0-or-later // // This file is part of Yt. // // You should have received a copy of the License along with this program. // If not, see . use rustpython::vm::{ PyRef, VirtualMachine, builtins::{PyDict, PyStr}, }; pub type InfoJson = serde_json::Map; pub fn json_loads( input: serde_json::Map, vm: &VirtualMachine, ) -> PyRef { let json = vm.import("json", 0).expect("Module exists"); let loads = json.get_attr("loads", vm).expect("Method exists"); let self_str = serde_json::to_string(&serde_json::Value::Object(input)).expect("Vaild json"); let dict = loads .call((self_str,), vm) .expect("Vaild json is always a valid dict"); dict.downcast().expect("Should always be a dict") } /// # Panics /// If expectation about python operations fail. pub fn json_dumps( input: PyRef, vm: &VirtualMachine, ) -> serde_json::Map { let json = vm.import("json", 0).expect("Module exists"); let dumps = json.get_attr("dumps", vm).expect("Method exists"); let dict = dumps .call((input,), vm) .map_err(|err| vm.print_exception(err)) .expect("Might not always work, but for our dicts it works"); let string: PyRef = dict.downcast().expect("Should always be a string"); let real_string = string.to_str().expect("Should be valid utf8"); // { // let mut file = File::create("debug.dump.json").unwrap(); // write!(file, "{}", real_string).unwrap(); // } let value: serde_json::Value = serde_json::from_str(real_string).expect("Should be valid json"); match value { serde_json::Value::Object(map) => map, _ => unreachable!("These should not be json.dumps output"), } }