use crate::BrokerItem;
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
use std::net::IpAddr;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct QueryParams {
pub ts_start: Option<String>,
pub ts_end: Option<String>,
pub collector_id: Option<String>,
pub project: Option<String>,
pub data_type: Option<String>,
pub page: i64,
pub page_size: i64,
pub peers_ip: Option<IpAddr>,
pub peers_asn: Option<u32>,
pub peers_only_full_feed: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum SortOrder {
ASC,
DESC,
}
impl Default for QueryParams {
fn default() -> Self {
QueryParams {
ts_start: None,
ts_end: None,
collector_id: None,
project: None,
data_type: None,
page: 1,
page_size: 100,
peers_ip: None,
peers_asn: None,
peers_only_full_feed: false,
}
}
}
impl Display for SortOrder {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
SortOrder::ASC => {
write!(f, "asc")
}
SortOrder::DESC => {
write!(f, "desc")
}
}
}
}
impl Display for QueryParams {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let mut params_vec = vec![];
if let Some(v) = &self.ts_start {
params_vec.push(format!("ts_start={}", v));
}
if let Some(v) = &self.ts_end {
params_vec.push(format!("ts_end={}", v));
}
if let Some(v) = &self.collector_id {
params_vec.push(format!("collector_id={}", v));
}
if let Some(v) = &self.project {
params_vec.push(format!("project={}", v));
}
if let Some(v) = &self.data_type {
params_vec.push(format!("data_type={}", v));
}
params_vec.push(format!("page={}", self.page));
params_vec.push(format!("page_size={}", self.page_size));
if !params_vec.is_empty() {
write!(f, "?{}", params_vec.join("&"))
} else {
write!(f, "")
}
}
}
impl QueryParams {
pub fn new() -> QueryParams {
QueryParams {
ts_start: None,
ts_end: None,
collector_id: None,
project: None,
data_type: None,
page: 1,
page_size: 10,
..Default::default()
}
}
pub fn ts_start(self, ts_start: &str) -> Self {
QueryParams {
ts_start: Some(ts_start.to_string()),
..self
}
}
pub fn ts_end(self, ts_end: &str) -> Self {
QueryParams {
ts_end: Some(ts_end.to_string()),
..self
}
}
pub fn page(self, page: i64) -> Self {
QueryParams { page, ..self }
}
pub fn page_size(self, page_size: i64) -> Self {
QueryParams { page_size, ..self }
}
pub fn data_type(self, data_type: &str) -> Self {
QueryParams {
data_type: Some(data_type.to_string()),
..self
}
}
pub fn project(self, project: &str) -> Self {
QueryParams {
project: Some(project.to_string()),
..self
}
}
pub fn collector_id(self, collector_id: &str) -> Self {
QueryParams {
collector_id: Some(collector_id.to_string()),
..self
}
}
}
#[allow(dead_code)]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "cli", derive(tabled::Tabled))]
pub struct BrokerCollector {
pub id: i64,
pub name: String,
pub url: String,
pub project: String,
pub updates_interval: i64,
}
#[allow(dead_code)]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "cli", derive(tabled::Tabled))]
pub struct BrokerItemType {
pub id: i64,
pub name: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub(crate) struct CollectorLatestResult {
pub count: u32,
pub data: Vec<BrokerItem>,
}
#[derive(Debug, Serialize, Deserialize)]
pub(crate) struct BrokerQueryResult {
pub total: Option<i64>,
pub count: Option<i64>,
pub page: Option<i64>,
pub page_size: Option<i64>,
pub error: Option<String>,
pub data: Vec<BrokerItem>,
}
#[allow(clippy::unwrap_used)]
impl Display for BrokerQueryResult {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", serde_json::to_string(self).unwrap())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_param_to_string() {
let param = QueryParams {
ts_start: Some("1".to_string()),
ts_end: Some("2".to_string()),
collector_id: None,
project: Some("test_project".to_string()),
data_type: None,
page: 1,
page_size: 20,
..Default::default()
};
assert_eq!(
"?ts_start=1&ts_end=2&project=test_project&page=1&page_size=20".to_string(),
param.to_string()
);
let param = QueryParams {
ts_start: None,
ts_end: None,
collector_id: None,
project: None,
data_type: None,
page: 1,
page_size: 20,
..Default::default()
};
assert_eq!("?page=1&page_size=20".to_string(), param.to_string());
}
}