# Table of Contents 1. [Data](#orgfd54f08) 1. [ValuePair](#org96768fd) 2. [Point](#org31a7ae8) 3. [Equipment](#org70735cf) 4. [DTGEN Format](#org74d7282) 5. [Data](#orgfa72db6) 2. [Random data gen](#orgfc32bff) 3. [Stream I/O](#org7797cd5) 1. [Lectura de archivos](#orgd3aa4d3) 2. [Lectura de stream y entrega de vector](#org5c2cd97) 3. [Lectura de stream y entrega a stream](#org20676c7) 4. [Tests](#orgc64e476) # 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 DTGEN 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 **createdata** 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. - readio - write-io De estas dos derivan las asociadas a archivos, para leer o escribir a archivos. - readfile - writefile 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. - rendertostream - streamtowriter 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** -> **readfile** 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 **readio** 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.