add method

Result<CacheEntry<K, V, U>, CachetteError> add(
  1. K key,
  2. V value, {
  3. ConflictPolicy? conflictPolicy,
  4. U? user,
  5. Set<U>? users,
})

Adds a cache item with key and value. Use conflictPolicy to override the Cachette's conflict policy. If user or users are provided, they will be added to the cache item. Note that in order to use users, ConflictPolicy.users must be used. Try saying the previous sentence out loud quickly.

Implementation

Result<CacheEntry<K, V, U>, CachetteError> add(
  K key,
  V value, {
  ConflictPolicy? conflictPolicy,
  U? user,
  Set<U>? users,
}) {
  conflictPolicy ??= this.conflictPolicy;
  if (_items.containsKey(key)) {
    switch (conflictPolicy) {
      case ConflictPolicy.overwrite:
      case ConflictPolicy.users:
        break;
      case ConflictPolicy.error:
        return Result.error(KeyConflictError(key));
      case ConflictPolicy.exception:
        throw CachetteException('Conflicting key: $key');
    }
  }

  final cleanRes = clean(sizeLimit: size - 1);
  if (!cleanRes.ok) {
    return Result.error(cleanRes.error!);
  }

  if (user != null) {
    users = {...?users, user};
  }

  _registry[key] = switch ((conflictPolicy, users)) {
    (ConflictPolicy.users, null) => EntryInfo.create(key),
    (ConflictPolicy.users, Set<U> users) =>
      _registry[key]?.addUsers(users) ?? EntryInfo.create(key, users),
    _ => EntryInfo.create(key, users),
  };

  _items[key] = value;

  return Result.ok(CacheEntry.build(value, _registry[key]!));
}