use std::fmt::Display;
use crate::{App, AppData, FQLType};
pub trait Reader {
fn index(&self, index: usize) -> Option<&AppData>;
fn find<T: Display>(&self, key: T, val: FQLType) -> Option<&AppData>;
fn find_index<T: Display>(&self, key: T, val: FQLType) -> Option<usize>;
fn find_index_from_data(&self, data: &AppData) -> Option<usize>;
fn find_all<T: Display>(&self, key: T, val: FQLType) -> Vec<&AppData>;
fn find_all_index<T: Display>(&self, key: T, val: FQLType) -> Vec<usize>;
fn find_by<T: Display>(&self, key: T, f: impl Fn(&FQLType) -> bool) -> Vec<&AppData>;
fn find_index_by<T: Display>(&self, key: T, f: impl Fn(&FQLType) -> bool) -> Vec<usize>;
}
impl Reader for App {
fn index(&self, index: usize) -> Option<&AppData> {
self.data.get(index)
}
fn find<T: Display>(&self, key: T, val: FQLType) -> Option<&AppData> {
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if val.eq(v) {
return Some(item);
}
}
}
None
}
fn find_index<T: Display>(&self, key: T, val: FQLType) -> Option<usize> {
let mut index = 0;
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if val.eq(v) {
return Some(index);
}
}
index += 1;
}
None
}
fn find_all<T: Display>(&self, key: T, val: FQLType) -> Vec<&AppData> {
let mut res = Vec::new();
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if val.eq(v) {
res.push(item);
}
}
}
res
}
fn find_all_index<T: Display>(&self, key: T, val: FQLType) -> Vec<usize> {
let mut index = 0;
let mut res = Vec::new();
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if val.eq(v) {
res.push(index);
}
}
index += 1;
}
res
}
fn find_by<T: Display>(&self, key: T, f: impl Fn(&FQLType) -> bool) -> Vec<&AppData> {
let mut res = Vec::new();
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if f(v) {
res.push(item);
}
}
}
res
}
fn find_index_by<T: Display>(&self, key: T, f: impl Fn(&FQLType) -> bool) -> Vec<usize> {
let mut index = 0;
let mut res = Vec::new();
for item in &self.data {
if let Some(v) = item.get(&key.to_string()) {
if f(v) {
res.push(index);
}
}
index += 1;
}
res
}
fn find_index_from_data(&self, data: &AppData) -> Option<usize> {
let mut index = 0;
for item in &self.data {
if item.eq(data) {
return Some(index);
}
index += 1;
}
None
}
}