use std::collections::HashMap; use symbols::Symbol; use resources::Resource; 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)) } }