use std::collections::HashMap; use resources::Resource; use symbols::Symbol; pub trait SymbolRepository<'a> { fn get_symbol(&'a self, resource: &Resource) -> Option>; } impl<'a, C> SymbolRepository<'a> for C where C: Fn(&Resource) -> Option>, { fn get_symbol(&'a self, resource: &Resource) -> Option> { self(resource) } } pub struct DispatchingSymbolRepository<'a> { repositories: HashMap<&'a str, Box + 'a>>, } impl<'a> DispatchingSymbolRepository<'a> { pub fn new(repositories: HashMap<&'a str, Box + 'a>>) -> Self { DispatchingSymbolRepository { repositories } } } impl<'a> SymbolRepository<'a> for DispatchingSymbolRepository<'a> { fn get_symbol(&'a self, resource: &Resource) -> Option> { self .repositories .get(resource.get_type()) .and_then(|repo| repo.get_symbol(resource)) } }