Search criteria implementation, fixes #3
This commit is contained in:
parent
50bd0a83d4
commit
1ab69aadb9
5 changed files with 43 additions and 11 deletions
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -862,6 +862,12 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "maplit"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "matches"
|
name = "matches"
|
||||||
version = "0.1.9"
|
version = "0.1.9"
|
||||||
|
@ -1047,6 +1053,7 @@ dependencies = [
|
||||||
"format-bytes",
|
"format-bytes",
|
||||||
"futures",
|
"futures",
|
||||||
"log",
|
"log",
|
||||||
|
"maplit",
|
||||||
"nom",
|
"nom",
|
||||||
"panorama-proto-common",
|
"panorama-proto-common",
|
||||||
"stderrlog",
|
"stderrlog",
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
panorama
|
panorama
|
||||||
========
|
========
|
||||||
|
|
||||||
[![](https://tokei.rs/b1/github/iptq/panorama?category=code)](https://github.com/XAMPPRocky/tokei)
|
|
||||||
|
|
||||||
Panorama is a terminal Personal Information Manager (PIM).
|
Panorama is a terminal Personal Information Manager (PIM).
|
||||||
|
|
||||||
Status: **still writing the basics**
|
Status: **still writing the basics**
|
||||||
|
|
|
@ -42,3 +42,6 @@ panorama-proto-common = { path = "../proto-common" }
|
||||||
|
|
||||||
# for fuzzing
|
# for fuzzing
|
||||||
arbitrary = { version = "1.0.2", optional = true, features = ["derive"] }
|
arbitrary = { version = "1.0.2", optional = true, features = ["derive"] }
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
maplit = "1.0.2"
|
||||||
|
|
|
@ -15,6 +15,9 @@ extern crate log;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate panorama_proto_common;
|
extern crate panorama_proto_common;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[macro_use]
|
||||||
|
extern crate maplit;
|
||||||
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
// pub mod events;
|
|
||||||
pub mod proto;
|
pub mod proto;
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
use std::{collections::HashSet, io::{self, Write}, ops::{Bound, RangeBounds}};
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
|
io::{self, Write},
|
||||||
|
ops::{Bound, RangeBounds},
|
||||||
|
};
|
||||||
|
|
||||||
use format_bytes::DisplayBytes;
|
use format_bytes::DisplayBytes;
|
||||||
use panorama_proto_common::{quote_string, Bytes};
|
use panorama_proto_common::{quote_string, Bytes};
|
||||||
|
@ -175,15 +179,15 @@ impl DisplayBytes for FetchItems {
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum FetchAttr {}
|
pub enum FetchAttr {}
|
||||||
|
|
||||||
// TODO: not the most efficient representation but I'll optimize if this ever actually becomes a
|
// TODO: not the most efficient representation but I'll optimize if this ever
|
||||||
// problem
|
// actually becomes a problem
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct SearchCriteria(HashSet<(Bound<u32>, Bound<u32>)>);
|
pub struct SearchCriteria(Vec<(Bound<u32>, Bound<u32>)>);
|
||||||
|
|
||||||
impl SearchCriteria {
|
impl SearchCriteria {
|
||||||
pub fn all() -> Self {
|
pub fn all() -> Self {
|
||||||
let mut set = HashSet::new();
|
let mut set = Vec::new();
|
||||||
set.insert((Bound::Unbounded, Bound::Unbounded));
|
set.push((Bound::Unbounded, Bound::Unbounded));
|
||||||
SearchCriteria(set)
|
SearchCriteria(set)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,6 +200,12 @@ impl SearchCriteria {
|
||||||
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_range(&mut self, range: impl RangeBounds<u32>) -> &mut Self {
|
||||||
|
let range = (range.start_bound().cloned(), range.end_bound().cloned());
|
||||||
|
self.0.push(range);
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DisplayBytes for SearchCriteria {
|
impl DisplayBytes for SearchCriteria {
|
||||||
|
@ -209,7 +219,7 @@ impl DisplayBytes for SearchCriteria {
|
||||||
match range.0 {
|
match range.0 {
|
||||||
Bound::Excluded(n) => write_bytes!(w, b"{}", &(n + 1))?,
|
Bound::Excluded(n) => write_bytes!(w, b"{}", &(n + 1))?,
|
||||||
Bound::Included(n) => write_bytes!(w, b"{}", &n)?,
|
Bound::Included(n) => write_bytes!(w, b"{}", &n)?,
|
||||||
Bound::Unbounded => write_bytes!(w, b"*")?,
|
Bound::Unbounded => write_bytes!(w, b"1")?,
|
||||||
}
|
}
|
||||||
|
|
||||||
write_bytes!(w, b":")?;
|
write_bytes!(w, b":")?;
|
||||||
|
@ -232,6 +242,17 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn display_search_criteria() {
|
fn display_search_criteria() {
|
||||||
// TODO: is there a trivial case?
|
// TODO: is there a trivial case?
|
||||||
assert_eq!(format_bytes!(b"{}", SearchCriteria::all()), b"*:*");
|
assert_eq!(format_bytes!(b"{}", SearchCriteria::all()), b"1:*");
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
format_bytes!(
|
||||||
|
b"{}",
|
||||||
|
SearchCriteria(vec![
|
||||||
|
(Bound::Unbounded, Bound::Included(4)),
|
||||||
|
(Bound::Excluded(5), Bound::Unbounded),
|
||||||
|
])
|
||||||
|
),
|
||||||
|
b"1:4,6:*"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue