10 releases
0.1.9 | Oct 29, 2021 |
---|---|
0.1.8 | Oct 13, 2021 |
0.1.3 | Aug 12, 2021 |
#570 in Hardware support
Used in datagen_network
130KB
715 lines
Table of Contents
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<P: AsRef<Path>>(
path: P) -> Result<Vec<Data>, Box<dyn Error>> {
// 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<R: io::BufRead >(
mut input: R,
end_flag: &String,
print: bool) -> Result<Vec<Data>, Box<dyn Error>> {
let mut lines: Vec<String> = vec![];
let mut dataset: Vec<Data> = 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.
Dependencies
~4–11MB
~115K SLoC