# Table of Contents 1. [Data](#org63433df) 1. [ValuePair](#org38f4a8b) 2. [Point](#org1426c02) 3. [Equipment](#org3afe002) 4. [DT\_GEN Format](#org4f28bf5) 5. [Data](#org90c666d) 2. [Random data gen](#orgabd0641) 3. [Stream I/O](#org7b4d2ec) 1. [Lectura de archivos](#org188e324) 2. [Lectura de stream y entrega de vector](#orgc4c81f6) 3. [Lectura de stream y entrega a stream](#org7e82481) 4. [Tests](#org6808af5) # Data La estructura **Data** contiene toda la información que podría generar un sensor base. Se necesita construir lo siguiente. ## DONE ValuePair ## DONE Point ## DONE Equipment ## DONE DT\_GEN Format ## DONE Data Todo está definido bajo una estrucura de directorios. tree src # Random data gen Es la serie de funciones que construyen aleatoriamente datos a solicitud. En **generators.rs** tenemos la función **create\_data** que genera una instancia de **Data** aleatoria. # Stream I/O Creación de comando que permite una entrada y deserializarla. Sea un stream o de un archivo. Hay dos funciones **síncronas** que permite leer o escribir desde un stream. - read\_io - write-io De estas dos derivan las asociadas a archivos, para leer o escribir a archivos. - read\_file - write\_file Asímismo, de manera **asíncrona** se usa **tokio** para crear las funciones que toman leen desde un **buffer** y lo envían por un canal y viceversa. - render\_to\_stream - stream\_to\_writer Estas funcionalidades son claves para que este módulo se pueda utilizar, por ejemplo, en servidores tcp o servicios generadores de datos para simular sensores. ## Lectura de archivos En **stream.rs** -> **read\_file** se implementa una función sencilla que toma un archivo completo y lo deserializa directamente para convertirlo en un array de Data. Esto es solo para un archivo de tipo **json**. pub fn read_file>( path: P) -> Result, Box> { // open file if exists path let file = File::open(path)?; // set file to buffer let reader = BufReader::new(file); // read the json contents let json_data = serde_json::from_reader(reader)?; // Return Data Ok(json_data) } ## Lectura de stream y entrega de vector Si el origen del dato viene de un stream, entonces se usa **read\_io** que toma la serie de valores (o de un archivo no json) pub fn read_io( mut input: R, end_flag: &String, print: bool) -> Result, Box> { let mut lines: Vec = vec![]; let mut dataset: Vec = vec![]; for value in input.lines() { let line = value?; if line.as_str().trim() == end_flag { let new_value = lines.join(""); let new_data = Data::json_loads(&new_value); if print { println!("{}", new_data); } dataset.push(new_data); lines.clear(); } else { if !line.trim().is_empty() { lines.push(line); } } } Ok(dataset) } ## Lectura de stream y entrega a stream En este caso, en vez de lograr un acumulador, tomar el Data convertido enviarlo mediante un stream con rasgo **Write**. Por ejemplo, podría necesitar enviarlo por una cola a un stream de socket, entonces crear un módulo que tome el dato, lo procese y envíe a otra parte, si es que lo necesita. También podría utilizarse para enviar a un proceso concurrente o funcionalidad atómica separada. # Tests Todas las operaciones disponibles para crear datos y enviarlos o recibirlos por stream están testeadas. Revisar los **tests** pueden servir para aprender a usar las funciones.