Crates.io | datagen_gnss |
lib.rs | datagen_gnss |
version | 0.1.9 |
source | src |
created_at | 2021-08-05 18:15:18.597898 |
updated_at | 2021-10-29 14:55:35.94371 |
description | Data generator in json format for test meeasurement systems |
homepage | |
repository | |
max_upload_size | |
id | 432110 |
size | 2,859,603 |
La estructura Data contiene toda la información que podría generar un sensor base.
Se necesita construir lo siguiente.
Todo está definido bajo una estrucura de directorios.
tree src
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.
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)
}
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)
}
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.