from data.cache.impl import NoopDataModelCache, InMemoryDataModelCache, MemcachedModelCache

def get_model_cache(config):
  """ Returns a data model cache matching the given configuration. """
  cache_config = config.get('DATA_MODEL_CACHE_CONFIG', {})
  engine = cache_config.get('engine', 'noop')

  if engine == 'noop':
    return NoopDataModelCache()

  if engine == 'inmemory':
    return InMemoryDataModelCache()

  if engine == 'memcached':
    endpoint = cache_config.get('endpoint', None)
    if endpoint is None:
      raise Exception('Missing `endpoint` for memcached model cache configuration')

    timeout = cache_config.get('timeout')
    connect_timeout = cache_config.get('connect_timeout')
    return MemcachedModelCache(endpoint, timeout=timeout, connect_timeout=connect_timeout)

  raise Exception('Unknown model cache engine `%s`' % engine)