use serde::{Deserialize, Serialize};
use crate::filter::{Anchor, Narrow};
use crate::{field_access, impl_default, impl_display, Flag, Operation};
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct Request {
anchor: Anchor,
include_anchor: Option<bool>,
num_before: u64,
num_after: u64,
narrow: Vec<Narrow>,
op: Operation,
flag: Flag,
}
impl Request {
pub const fn new() -> Self {
Self {
anchor: Anchor::new(),
include_anchor: None,
num_before: 0,
num_after: 0,
narrow: Vec::new(),
op: Operation::new(),
flag: Flag::new(),
}
}
}
field_access! {
Request {
anchor: Anchor,
num_before: u64,
num_after: u64,
op: Operation,
flag: Flag,
}
}
field_access! {
Request {
include_anchor: option { bool },
}
}
field_access! {
Request {
narrow: cow { [Narrow] },
}
}
impl_default!(Request);
impl_display!(Request);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_request() {
let anchor = Anchor::new();
let include_anchor = true;
let num_before = 1;
let num_after = 2;
let narrow = [Narrow::new()];
let op = Operation::new();
let flag = Flag::new();
let request = Request::new()
.with_anchor(anchor)
.with_include_anchor(include_anchor)
.with_num_before(num_before)
.with_num_after(num_after)
.with_narrow(narrow.as_ref())
.with_op(op)
.with_flag(flag);
let request_json = request.to_string();
assert_eq!(serde_json::to_string(&request).unwrap(), request_json);
assert_eq!(
serde_json::from_str::<Request>(&request_json).unwrap(),
request
);
assert_eq!(request.anchor(), anchor);
assert_eq!(request.include_anchor(), Some(include_anchor));
assert_eq!(request.num_before(), num_before);
assert_eq!(request.num_after(), num_after);
assert_eq!(request.narrow(), narrow.as_ref());
assert_eq!(request.op(), op);
assert_eq!(request.flag(), flag);
}
}