#ifndef SERVICES_PREFERENCES_PUBLIC_CPP_DICTIONARY_VALUE_UPDATE_H_
#define SERVICES_PREFERENCES_PUBLIC_CPP_DICTIONARY_VALUE_UPDATE_H_
#include <memory>
#include <string>
#include <string_view>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/values.h"
#include "services/preferences/public/cpp/scoped_pref_update.h"
namespace prefs {
class DictionaryValueUpdate {
public:
using UpdateCallback =
base::RepeatingCallback<void(std::vector<std::string>)>;
DictionaryValueUpdate(UpdateCallback report_update,
base::Value::Dict* value,
std::vector<std::string> path);
DictionaryValueUpdate(const DictionaryValueUpdate&) = delete;
DictionaryValueUpdate& operator=(const DictionaryValueUpdate&) = delete;
~DictionaryValueUpdate();
bool HasKey(std::string_view key) const;
size_t size() const;
bool empty() const;
void Clear();
void Set(std::string_view path, base::Value in_value);
void SetBoolean(std::string_view path, bool in_value);
void SetInteger(std::string_view path, int in_value);
void SetDouble(std::string_view path, double in_value);
void SetString(std::string_view path, std::string_view in_value);
void SetString(std::string_view path, const std::u16string& in_value);
std::unique_ptr<DictionaryValueUpdate> SetDictionary(
std::string_view path,
base::Value::Dict in_value);
base::Value* SetKey(std::string_view key, base::Value value);
void SetWithoutPathExpansion(std::string_view key, base::Value in_value);
std::unique_ptr<DictionaryValueUpdate> SetDictionaryWithoutPathExpansion(
std::string_view path,
base::Value::Dict in_value);
bool GetBoolean(std::string_view path, bool* out_value) const;
bool GetInteger(std::string_view path, int* out_value) const;
bool GetDouble(std::string_view path, double* out_value) const;
bool GetString(std::string_view path, std::string* out_value) const;
bool GetDictionary(std::string_view path,
const base::Value::Dict** out_value) const;
bool GetDictionary(std::string_view path,
std::unique_ptr<DictionaryValueUpdate>* out_value);
bool GetDictionaryWithoutPathExpansion(
std::string_view key,
std::unique_ptr<DictionaryValueUpdate>* out_value);
bool GetListWithoutPathExpansion(std::string_view key,
base::Value::List** out_value);
bool Remove(std::string_view path);
bool RemoveWithoutPathExpansion(std::string_view key, base::Value* out_value);
base::Value::Dict* AsDict();
const base::Value::Dict* AsConstDict() const;
private:
void RecordPath(std::string_view path);
void RecordSplitPath(const std::vector<std::string_view>& path);
void RecordKey(std::string_view key);
std::vector<std::string_view> SplitPath(std::string_view path);
std::vector<std::string> ConcatPath(const std::vector<std::string>& base_path,
std::string_view path);
std::vector<std::string> ConcatPath(
const std::vector<std::string>& base_path,
const std::vector<std::string_view>& path);
UpdateCallback report_update_;
RAW_PTR_EXCLUSION base::Value::Dict* const value_;
const std::vector<std::string> path_;
};
}
#endif