style: format with clippy

This commit is contained in:
nm17 2024-06-02 01:01:37 +04:00
parent 04a21c79f6
commit b234914d8b
Signed by: nm17
GPG key ID: 3303B70C59145CD4
10 changed files with 38 additions and 52 deletions

View file

@ -1,20 +1,19 @@
use nom::error::VerboseError; use nom::error::VerboseError;
use std::fmt::{Debug}; use std::fmt::Debug;
use std::num::ParseFloatError; use std::num::ParseFloatError;
use thiserror::Error as ThisError; use thiserror::Error as ThisError;
#[allow(dead_code)]
#[derive(Debug, ThisError)] #[derive(Debug, ThisError)]
pub enum Error<I: Debug> { pub enum Error<I: Debug> {
#[error("Nom error: {0}")] #[error("Nom error: {0}")]
NomError(#[from] nom::Err<VerboseError<I>>), Nom(#[from] nom::Err<VerboseError<I>>),
#[error("Failed to parse a timestamp")] #[error("Failed to parse a timestamp")]
TimestampParseError(ParseFloatError), TimestampParseError(ParseFloatError),
#[error("Unknown unit")] #[error("Unknown unit")]
UnknownUnit(I), UnknownUnit(I),
#[error("Failed to parse a number")] #[error("Failed to parse a number")]
DecimalParseError(#[from] rust_decimal::Error), DecimalParsing(#[from] rust_decimal::Error),
} }

View file

@ -19,7 +19,7 @@ use serde::{Deserialize, Serialize};
use serde_with::serde_as; use serde_with::serde_as;
use ufmt::uwrite; use ufmt::uwrite;
use std::collections::{BTreeMap, HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
/// Данные с одного датчика. /// Данные с одного датчика.
@ -118,8 +118,8 @@ impl NMDeviceDataPacket {
let device_exists: Option<bool> = redis.hget(key.as_str(), "exists").await?; let device_exists: Option<bool> = redis.hget(key.as_str(), "exists").await?;
if !device_exists.is_some_and(|v| v == true) { if !device_exists.is_some_and(|v| v) {
return Err(AppError::DeviceNotFound(hex::encode(&self.mac))); return Err(AppError::DeviceNotFound(hex::encode(self.mac)));
} }
// devices_{device_id}_{tai_timestamp}_{sensor_id} // devices_{device_id}_{tai_timestamp}_{sensor_id}
@ -150,7 +150,7 @@ impl NMDeviceDataPacket {
} }
} }
return Ok(()); Ok(())
} }
} }
@ -165,6 +165,6 @@ impl NMJsonPacket {
device.save_to_db(redis).await?; device.save_to_db(redis).await?;
} }
return Ok(()); Ok(())
} }
} }

View file

@ -6,7 +6,6 @@ use nom::character::complete::hex_digit1;
use std::str::FromStr; use std::str::FromStr;
use crate::ingest_protocol::error::Error; use crate::ingest_protocol::error::Error;
use crate::ingest_protocol::error::Error::TimestampParseError;
use crate::ingest_protocol::{NMDeviceDataPacket, SensorValue}; use crate::ingest_protocol::{NMDeviceDataPacket, SensorValue};
use nom::combinator::{map_parser, opt}; use nom::combinator::{map_parser, opt};
use nom::error::context; use nom::error::context;
@ -85,7 +84,7 @@ pub fn parse_packet_body<'a>(
let sensor_time = match sensor_time { let sensor_time = match sensor_time {
Some(v) => Some(Epoch::from_unix_seconds( Some(v) => Some(Epoch::from_unix_seconds(
v.parse().map_err(TimestampParseError)?, v.parse().map_err(Error::TimestampParseError)?,
)), )),
None => None, None => None,
}; };

View file

@ -43,14 +43,14 @@ impl<'de> Deserialize<'de> for EpochUTC {
where where
E: de::Error, E: de::Error,
{ {
return Ok(Epoch::from_unix_seconds(v as f64).into()); Ok(Epoch::from_unix_seconds(v as f64).into())
} }
fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E> fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
where where
E: de::Error, E: de::Error,
{ {
return Ok(Epoch::from_unix_seconds(v).into()); Ok(Epoch::from_unix_seconds(v).into())
} }
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E> fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
@ -65,9 +65,9 @@ impl<'de> Deserialize<'de> for EpochUTC {
) as f64) ) as f64)
.into()); .into());
} }
return Ok( Ok(
Epoch::from_unix_seconds(value.parse().map_err(de::Error::custom)?).into(), Epoch::from_unix_seconds(value.parse().map_err(de::Error::custom)?).into(),
); )
} }
} }

View file

@ -1,7 +1,6 @@
//! Глобальный модуль для вспомогательных типов и утилит. //! Глобальный модуль для вспомогательных типов и утилит.
//! //!
mod hifitime_serde; mod hifitime_serde;
use phf::phf_map; use phf::phf_map;
@ -10,11 +9,11 @@ use std::borrow::Cow;
pub use hifitime_serde::EpochUTC; pub use hifitime_serde::EpochUTC;
/// Поддерживаемые типы. /// Поддерживаемые типы.
/// ///
/// TODO: Решить необходимо ли к данным прикреплять единицы измерения. /// TODO: Решить необходимо ли к данным прикреплять единицы измерения.
/// TODO: Сейчас вообще сомнительно оставлять ли это или нет. /// TODO: Сейчас вообще сомнительно оставлять ли это или нет.
#[allow(dead_code)]
#[derive(Debug, Clone, Hash, PartialEq, Eq)] #[derive(Debug, Clone, Hash, PartialEq, Eq)]
#[repr(u64)] #[repr(u64)]
pub enum SupportedUnit { pub enum SupportedUnit {
@ -35,8 +34,8 @@ pub enum SupportedUnit {
impl Serialize for SupportedUnit { impl Serialize for SupportedUnit {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where where
S: Serializer, S: Serializer,
{ {
serializer.serialize_str(match self { serializer.serialize_str(match self {
SupportedUnit::Celsius => "C", SupportedUnit::Celsius => "C",
@ -58,8 +57,8 @@ impl Serialize for SupportedUnit {
impl<'de> Deserialize<'de> for SupportedUnit { impl<'de> Deserialize<'de> for SupportedUnit {
fn deserialize<'a, D>(deserializer: D) -> Result<Self, D::Error> fn deserialize<'a, D>(deserializer: D) -> Result<Self, D::Error>
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
let color_str = Cow::<'a, str>::deserialize(deserializer)?; let color_str = Cow::<'a, str>::deserialize(deserializer)?;
match STR_TO_UNITS.get(color_str.as_ref()) { match STR_TO_UNITS.get(color_str.as_ref()) {

View file

@ -13,7 +13,6 @@ use crate::web_server::old_device_sensor_api::qs_parser::QSParserError;
use rust_decimal::Decimal; use rust_decimal::Decimal;
use serde_json::json; use serde_json::json;
/// Главный объект ошибки [std::error::Error] для всего Web API. /// Главный объект ошибки [std::error::Error] для всего Web API.
/// ///
/// В целом, все Result у Web сервера должны использовать этот Error. /// В целом, все Result у Web сервера должны использовать этот Error.
@ -50,7 +49,7 @@ pub enum AppError {
}, },
#[display(fmt = "IDK")] #[display(fmt = "IDK")]
DeviceNotFound(String) DeviceNotFound(String),
} }
impl web::error::WebResponseError for AppError { impl web::error::WebResponseError for AppError {
@ -64,7 +63,7 @@ impl web::error::WebResponseError for AppError {
AppError::ApiKeyInvalid { .. } => StatusCode::BAD_REQUEST, AppError::ApiKeyInvalid { .. } => StatusCode::BAD_REQUEST,
AppError::UnknownBody { .. } => StatusCode::BAD_REQUEST, AppError::UnknownBody { .. } => StatusCode::BAD_REQUEST,
AppError::QSError(..) => StatusCode::BAD_REQUEST, AppError::QSError(..) => StatusCode::BAD_REQUEST,
AppError::DeviceNotFound(..) => StatusCode::BAD_REQUEST AppError::DeviceNotFound(..) => StatusCode::BAD_REQUEST,
} }
} }
@ -118,16 +117,15 @@ impl web::error::WebResponseError for AppError {
AppError::ApiKeyInvalid { reason } => { AppError::ApiKeyInvalid { reason } => {
insert_header!(headers, "X-Error-Description", *reason); insert_header!(headers, "X-Error-Description", *reason);
} }
AppError::QSError(err) => match err { AppError::QSError(err) => {
QSParserError::ParsingError(desc) => { if let QSParserError::Parsing(desc) = err {
insert_header!( insert_header!(
headers, headers,
"X-Error-Description", "X-Error-Description",
desc.escape_default().to_string() desc.escape_default().to_string()
); );
} }
_ => {} }
},
_ => {} _ => {}
}; };

View file

@ -5,11 +5,9 @@
//! //!
//! TODO: Начать работу над TCP/UDP и MQTT сервером //! TODO: Начать работу над TCP/UDP и MQTT сервером
use old_app_api::old_api_handler;
use fred::bytes_utils::Str; use fred::bytes_utils::Str;
use fred::prelude::*; use fred::prelude::*;
use old_app_api::old_api_handler;
pub mod app_error; pub mod app_error;
pub mod old_app_api; pub mod old_app_api;
@ -32,7 +30,7 @@ pub async fn server_main() {
let client = RedisClient::new(config, Some(perf), Some(policy)); let client = RedisClient::new(config, Some(perf), Some(policy));
// connect to the server, returning a handle to the task that drives the connection // connect to the server, returning a handle to the task that drives the connection
let _ = client.connect(); client.connect().await.unwrap().unwrap();
client.wait_for_connect().await.unwrap(); client.wait_for_connect().await.unwrap();
let asd: Str = client.ping().await.unwrap(); let asd: Str = client.ping().await.unwrap();

View file

@ -33,10 +33,7 @@ pub async fn old_api_handler(
let mandatory_params: MandatoryParams<'_> = serde_json::from_slice(body_bytes)?; // TODO: Simd-JSON let mandatory_params: MandatoryParams<'_> = serde_json::from_slice(body_bytes)?; // TODO: Simd-JSON
// Ignore clippy singlematch // Ignore clippy singlematch
match mandatory_params.cmd.as_ref() { if mandatory_params.cmd.as_ref() == "version" { return version((), &app_state).await }
"version" => return version((), &app_state).await,
_ => {}
}
is_api_key_valid(&app_state.redis_client, mandatory_params.api_key.as_ref()).await?; is_api_key_valid(&app_state.redis_client, mandatory_params.api_key.as_ref()).await?;

View file

@ -4,19 +4,14 @@ pub mod qs_parser;
use crate::ingest_protocol::{NMDeviceDataPacket, NMJsonPacket}; use crate::ingest_protocol::{NMDeviceDataPacket, NMJsonPacket};
use crate::web_server::app_error::AppError; use crate::web_server::app_error::AppError;
use fred::bytes_utils::Str;
use fred::prelude::*;
use hifitime::Epoch;
use ntex::http::{HttpMessage, StatusCode}; use ntex::http::{HttpMessage, StatusCode};
use ntex::util::Bytes; use ntex::util::Bytes;
use ntex::web::types::State; use ntex::web::types::State;
use ntex::{http, web}; use ntex::{http, web};
use qs_parser::QSParserError; use qs_parser::QSParserError;
use thiserror::Error; use thiserror::Error;
use ufmt::uwrite;
use futures_util::stream::StreamExt;
use super::NMAppState; use super::NMAppState;

View file

@ -11,18 +11,19 @@ use std::sync::Arc;
use thiserror::Error; use thiserror::Error;
/// В иделае было бы хорошо сделать всё как у [serde_json::Error], но это слишком большая морока /// В иделае было бы хорошо сделать всё как у [serde_json::Error], но это слишком большая морока
#[allow(dead_code)]
#[derive(Error, Clone, Debug)] #[derive(Error, Clone, Debug)]
pub enum QSParserError { pub enum QSParserError {
#[error("asd")] #[error("asd")]
SerdeQSError(#[from] Arc<serde_qs::Error>), SerdeQS(#[from] Arc<serde_qs::Error>),
#[error("asd")] #[error("asd")]
ParsingError(String), Parsing(String),
#[error("asd")] #[error("asd")]
FloatParseError(#[from] ParseFloatError), FloatParse(#[from] ParseFloatError),
#[error("failed to parse into decimal")] #[error("failed to parse into decimal")]
DecimalParseError(#[from] rust_decimal::Error), DecimalParse(#[from] rust_decimal::Error),
#[error("asd")] #[error("asd")]
NoMAC, NoMAC,
@ -30,13 +31,13 @@ pub enum QSParserError {
impl From<Error<&str>> for QSParserError { impl From<Error<&str>> for QSParserError {
fn from(value: Error<&str>) -> Self { fn from(value: Error<&str>) -> Self {
QSParserError::ParsingError(format!("{:?}", value)) QSParserError::Parsing(format!("{:?}", value))
} }
} }
impl From<serde_qs::Error> for QSParserError { impl From<serde_qs::Error> for QSParserError {
fn from(value: serde_qs::Error) -> Self { fn from(value: serde_qs::Error) -> Self {
QSParserError::SerdeQSError(Arc::new(value)) QSParserError::SerdeQS(Arc::new(value))
} }
} }
@ -68,22 +69,22 @@ pub fn parse_decimal_if_exists(
parsed: &mut HashMap<String, String>, parsed: &mut HashMap<String, String>,
key: &str, key: &str,
) -> Result<Option<Decimal>, QSParserError> { ) -> Result<Option<Decimal>, QSParserError> {
return if let Some(unwrapped_value) = parsed.remove(key) { if let Some(unwrapped_value) = parsed.remove(key) {
Ok(Some(Decimal::from_str(unwrapped_value.as_str())?)) Ok(Some(Decimal::from_str(unwrapped_value.as_str())?))
} else { } else {
Ok(None) Ok(None)
}; }
} }
pub fn parse_epoch_if_exists( pub fn parse_epoch_if_exists(
parsed: &mut HashMap<String, String>, parsed: &mut HashMap<String, String>,
key: &str, key: &str,
) -> Result<Option<Epoch>, QSParserError> { ) -> Result<Option<Epoch>, QSParserError> {
return if let Some(unwrapped_value) = parsed.remove(key) { if let Some(unwrapped_value) = parsed.remove(key) {
Ok(Some(Epoch::from_unix_seconds(unwrapped_value.parse()?))) Ok(Some(Epoch::from_unix_seconds(unwrapped_value.parse()?)))
} else { } else {
Ok(None) Ok(None)
}; }
} }
pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSParserError> { pub async fn parse_nm_qs_format(input: &str) -> Result<NMDeviceDataPacket, QSParserError> {