rs_simple_logging/proxy/
copy.rs

1use std::collections::BTreeMap;
2
3use crate::Item;
4
5pub trait Proxy {
6    fn get_item(&self, original: Item) -> Item;
7}
8
9struct ProxyNop {}
10
11impl Proxy for ProxyNop {
12    fn get_item(&self, original: Item) -> Item {
13        original
14    }
15}
16
17struct ProxyFn<P> {
18    internal: P,
19}
20
21impl<P> Proxy for ProxyFn<P>
22where
23    P: Fn(Item) -> Item,
24{
25    fn get_item(&self, original: Item) -> Item {
26        (self.internal)(original)
27    }
28}
29
30pub fn proxy_new_from_fn<P>(internal: P) -> impl Proxy
31where
32    P: Fn(Item) -> Item,
33{
34    ProxyFn { internal }
35}
36
37pub fn proxy_join<P, Q>(p: P, q: Q) -> impl Proxy
38where
39    P: Proxy,
40    Q: Proxy,
41{
42    proxy_new_from_fn(move |original: Item| {
43        let after_p: Item = p.get_item(original);
44        q.get_item(after_p)
45    })
46}
47
48pub trait ResourceProxy {
49    fn get_resource(&self, name: &str) -> Option<&str>;
50}
51
52struct ResourceProxyMap {
53    internal: BTreeMap<String, String>,
54}
55
56impl ResourceProxy for ResourceProxyMap {
57    fn get_resource(&self, name: &str) -> Option<&str> {
58        self.internal.get(name).map(|s| s.as_str())
59    }
60}
61
62pub fn resource_proxy_new_from_map(internal: BTreeMap<String, String>) -> impl ResourceProxy {
63    ResourceProxyMap { internal }
64}
65
66pub fn proxy_new_from_resource_proxy<R>(resource_proxy: R) -> impl Proxy
67where
68    R: ResourceProxy,
69{
70    proxy_new_from_fn(move |mut original: Item| {
71        for pair in original.resource.iter_mut() {
72            let (key, val) = pair;
73            let neo: Option<&str> = resource_proxy.get_resource(key);
74            match neo {
75                None => {}
76                Some(v) => {
77                    let s: String = v.into();
78                    *val = s
79                }
80            }
81        }
82        original
83    })
84}