use serde::{Deserialize, Serialize};
use crate::search::Script;
#[cfg(feature = "graphql")]
use crate::search::ScriptInput;
#[cfg(feature = "graphql")]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(async_graphql::InputObject, Serialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct RangeAggregationInput {
#[cfg_attr(feature = "builder", builder(default))]
pub field: Option<String>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub script: Option<ScriptInput>,
#[graphql(default)]
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default)]
pub ranges: Vec<RangeInput>,
}
#[cfg_attr(test, derive(PartialEq))]
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct RangeAggregation {
#[cfg_attr(feature = "builder", builder(default))]
pub field: Option<String>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
pub script: Option<Script>,
#[cfg_attr(feature = "builder", builder(default))]
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default)]
pub ranges: Vec<Range>,
}
#[cfg(feature = "graphql")]
impl From<RangeAggregationInput> for RangeAggregation {
#[inline]
fn from(input: RangeAggregationInput) -> Self {
RangeAggregation {
field: input.field,
script: input.script.map(Into::into),
ranges: input.ranges.into_iter().map(Into::into).collect(),
}
}
}
#[cfg(feature = "graphql")]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(async_graphql::InputObject, Serialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct RangeInput {
#[serde(default, skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "builder", builder(default))]
from: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "builder", builder(default))]
to: Option<f64>,
}
#[cfg_attr(test, derive(PartialEq))]
#[cfg_attr(feature = "graphql", derive(async_graphql::SimpleObject))]
#[cfg_attr(feature = "builder", derive(typed_builder::TypedBuilder))]
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(feature = "builder", builder(field_defaults(setter(into))))]
pub struct Range {
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
from: Option<f64>,
#[cfg_attr(feature = "builder", builder(default))]
#[serde(default, skip_serializing_if = "Option::is_none")]
to: Option<f64>,
}
#[cfg(feature = "graphql")]
impl From<RangeInput> for Range {
#[inline]
fn from(input: RangeInput) -> Self {
Range {
from: input.from,
to: input.to,
}
}
}