use pyo3::{exceptions::PyTypeError, prelude::*, types::IntoPyDict}; use cryo_cli::{run, Args}; #[pyfunction( signature = ( datatype = None, blocks = None, *, remember = false, command = None, timestamps = None, txs = None, align = false, reorg_buffer = 0, include_columns = None, exclude_columns = None, columns = None, u256_types = None, hex = false, sort = None, exclude_failed = false, rpc = None, network_name = None, requests_per_second = None, max_concurrent_requests = None, max_concurrent_chunks = None, chunk_order = None, max_retries = 10, initial_backoff = 500, dry = false, chunk_size = 1000, n_chunks = None, partition_by = None, output_dir = ".".to_string(), subdirs = vec![], label = None, overwrite = false, csv = false, json = false, row_group_size = None, n_row_groups = None, no_stats = false, compression = vec!["lz4".to_string()], report_dir = None, no_report = false, address = None, to_address = None, from_address = None, call_data = None, function = None, inputs = None, slot = None, contract = None, topic0 = None, topic1 = None, topic2 = None, topic3 = None, inner_request_size = 1, js_tracer = None, verbose = false, no_verbose = false, event_signature = None, ) )] #[allow(clippy::too_many_arguments)] pub fn _freeze( py: Python<'_>, datatype: Option>, blocks: Option>, remember: bool, command: Option, timestamps: Option>, txs: Option>, align: bool, reorg_buffer: u64, include_columns: Option>, exclude_columns: Option>, columns: Option>, u256_types: Option>, hex: bool, sort: Option>, exclude_failed: bool, rpc: Option, network_name: Option, requests_per_second: Option, max_concurrent_requests: Option, max_concurrent_chunks: Option, chunk_order: Option, max_retries: u32, initial_backoff: u64, dry: bool, chunk_size: u64, n_chunks: Option, partition_by: Option>, output_dir: String, subdirs: Vec, label: Option, overwrite: bool, csv: bool, json: bool, row_group_size: Option, n_row_groups: Option, no_stats: bool, compression: Vec, report_dir: Option, no_report: bool, address: Option>, to_address: Option>, from_address: Option>, call_data: Option>, function: Option>, inputs: Option>, slot: Option>, contract: Option>, topic0: Option>, topic1: Option>, topic2: Option>, topic3: Option>, inner_request_size: u64, js_tracer: Option, verbose: bool, no_verbose: bool, event_signature: Option, ) -> PyResult<&PyAny> { if let Some(command) = command { freeze_command(py, command) } else if let Some(datatype) = datatype { let args = Args { datatype, blocks, remember, txs, timestamps, align, reorg_buffer, include_columns, exclude_columns, columns, u256_types, hex, sort, exclude_failed, rpc, network_name, requests_per_second, max_concurrent_requests, max_concurrent_chunks, chunk_order, max_retries, initial_backoff, dry, chunk_size, n_chunks, partition_by, output_dir, subdirs, label, overwrite, csv, json, row_group_size, n_row_groups, no_stats, compression, report_dir: report_dir.map(std::path::PathBuf::from), no_report, address, to_address, from_address, call_data, function, inputs, slot, contract, topic0, topic1, topic2, topic3, inner_request_size, js_tracer, verbose, no_verbose, event_signature, }; pyo3_asyncio::tokio::future_into_py(py, async move { match run(args).await { Ok(Some(result)) => Python::with_gil(|py| { // let paths = PyDict::new(py); // for (key, values) in &result.paths { // let key = key.dataset().name(); // let values: Vec<&str> = values.iter().filter_map(|p| // p.to_str()).collect(); paths.set_item(key, // values).unwrap(); } // let paths = paths.to_object(py); let dict = [ ("n_completed".to_string(), result.completed.len().into_py(py)), ("n_skipped".to_string(), result.skipped.len().into_py(py)), ("n_errored".to_string(), result.errored.len().into_py(py)), // ("paths".to_string(), paths), ] .into_py_dict(py); Ok(dict.to_object(py)) }), Ok(None) => Ok(Python::with_gil(|py| py.None())), _ => Err(PyErr::new::("failed")), } }) } else { return Err(PyErr::new::("must specify datatypes or command")) } } fn freeze_command(py: Python<'_>, command: String) -> PyResult<&PyAny> { pyo3_asyncio::tokio::future_into_py(py, async move { let args = cryo_cli::parse_str(command.as_str()).await.expect("could not parse inputs"); match run(args).await { Ok(Some(result)) => Python::with_gil(|py| { // let paths = PyDict::new(py); // for (key, values) in &result.paths { // let key = key.dataset().name(); // let values: Vec<&str> = values.iter().filter_map(|p| p.to_str()).collect(); // paths.set_item(key, values).unwrap(); // } // let paths = paths.to_object(py); let dict = [ ("n_completed".to_string(), result.completed.len().into_py(py)), ("n_skipped".to_string(), result.skipped.len().into_py(py)), ("n_errored".to_string(), result.errored.len().into_py(py)), // ("paths".to_string(), paths), ] .into_py_dict(py); Ok(dict.to_object(py)) }), Ok(None) => Ok(Python::with_gil(|py| py.None())), _ => Err(PyErr::new::("failed")), } }) }