#ifndef SERVICES_PREFERENCES_PUBLIC_CPP_DICTIONARY_VALUE_UPDATE_H_
#define SERVICES_PREFERENCES_PUBLIC_CPP_DICTIONARY_VALUE_UPDATE_H_
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/strings/string_piece.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(base::StringPiece key) const;
size_t size() const;
bool empty() const;
void Clear();
void Set(base::StringPiece path, base::Value in_value);
void SetBoolean(base::StringPiece path, bool in_value);
void SetInteger(base::StringPiece path, int in_value);
void SetDouble(base::StringPiece path, double in_value);
void SetString(base::StringPiece path, base::StringPiece in_value);
void SetString(base::StringPiece path, const std::u16string& in_value);
std::unique_ptr<DictionaryValueUpdate> SetDictionary(
base::StringPiece path,
base::Value::Dict in_value);
base::Value* SetKey(base::StringPiece key, base::Value value);
void SetWithoutPathExpansion(base::StringPiece key, base::Value in_value);
std::unique_ptr<DictionaryValueUpdate> SetDictionaryWithoutPathExpansion(
base::StringPiece path,
base::Value::Dict in_value);
bool GetBoolean(base::StringPiece path, bool* out_value) const;
bool GetInteger(base::StringPiece path, int* out_value) const;
bool GetDouble(base::StringPiece path, double* out_value) const;
bool GetString(base::StringPiece path, std::string* out_value) const;
bool GetDictionary(base::StringPiece path,
const base::Value::Dict** out_value) const;
bool GetDictionary(base::StringPiece path,
std::unique_ptr<DictionaryValueUpdate>* out_value);
bool GetDictionaryWithoutPathExpansion(
base::StringPiece key,
std::unique_ptr<DictionaryValueUpdate>* out_value);
bool GetListWithoutPathExpansion(base::StringPiece key,
base::Value::List** out_value);
bool Remove(base::StringPiece path);
bool RemoveWithoutPathExpansion(base::StringPiece key,
base::Value* out_value);
base::Value::Dict* AsDict();
const base::Value::Dict* AsConstDict() const;
private:
void RecordPath(base::StringPiece path);
void RecordSplitPath(const std::vector<base::StringPiece>& path);
void RecordKey(base::StringPiece key);
std::vector<base::StringPiece> SplitPath(base::StringPiece path);
std::vector<std::string> ConcatPath(const std::vector<std::string>& base_path,
base::StringPiece path);
std::vector<std::string> ConcatPath(
const std::vector<std::string>& base_path,
const std::vector<base::StringPiece>& path);
UpdateCallback report_update_;
RAW_PTR_EXCLUSION base::Value::Dict* const value_;
const std::vector<std::string> path_;
};
}
#endif