A library for writing host-specific, single-binary configuration management and deployment tools
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

30 lines
926 B

7 years ago
7 years ago
7 years ago
5 years ago
  1. use std::collections::HashMap;
  2. use symbols::Symbol;
  3. use resources::Resource;
  4. pub trait SymbolRepository<'a> {
  5. fn get_symbol(&'a self, resource: &Resource) -> Option<Box<Symbol + 'a>>;
  6. }
  7. impl<'a, C> SymbolRepository<'a> for C where C: Fn(&Resource) -> Option<Box<Symbol + 'a>> {
  8. fn get_symbol(&'a self, resource: &Resource) -> Option<Box<Symbol + 'a>> {
  9. self(resource)
  10. }
  11. }
  12. pub struct DispatchingSymbolRepository<'a> {
  13. repositories: HashMap<&'a str, Box<SymbolRepository<'a> + 'a>>
  14. }
  15. impl<'a> DispatchingSymbolRepository<'a> {
  16. pub fn new(repositories: HashMap<&'a str, Box<SymbolRepository<'a> + 'a>>) -> Self {
  17. DispatchingSymbolRepository { repositories }
  18. }
  19. }
  20. impl<'a> SymbolRepository<'a> for DispatchingSymbolRepository<'a> {
  21. fn get_symbol(&'a self, resource: &Resource) -> Option<Box<Symbol + 'a>> {
  22. self.repositories.get(resource.get_type()).and_then(|repo| repo.get_symbol(resource))
  23. }
  24. }