+TITLE: Notas de desarrollo.

* DONE ValuePair * DONE Point * DONE Equipment * DONE DT_GEN Format ** DONE Data

Todo está definido bajo una estrucura de directorios.

+begin_src shell :results output

tree src

+end_src

+RESULTS:

+begin_example

src ├── elements │   ├── data.rs │   ├── dtgenformat.rs │   ├── equipment.rs │   ├── mod.rs │   ├── point.rs │   └── valuepair.rs ├── generators.rs ├── lib.rs ├── main.rs └── stream ├── asyncread.rs ├── asyncread.rs~ ├── asyncwrite.rs ├── asyncwrite.rs~ ├── mod.rs ├── read.rs ├── write.rs ├── write.rs~ └── writeto_stream.rs

2 directories, 18 files

+end_example

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.

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.

De estas dos derivan las asociadas a archivos, para leer o escribir a archivos.

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.

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.

+begin_src rust

pub fn readfile>( 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 jsondata = serdejson::fromreader(reader)?; // Return Data Ok(json_data) }

+end_src

** 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)

+begin_src rust

pub fn readioflag: &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.asstr().trim() == endflag { let newvalue = lines.join(""); let newdata = Data::jsonloads(&newvalue); if print { println!("{}", newdata); } dataset.push(newdata); lines.clear(); } else { if !line.trim().is_empty() { lines.push(line); } } } Ok(dataset) }

+end_src

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

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.