# 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.