nlib
nn::nlib::msgpack::JsonPatchBuilder クラスfinal

JSON Patch (RFC-6902)を作成するためのクラスです。 [詳解]

#include "nn/nlib/msgpack/JsonPatch.h"

公開メンバ関数

errno_t Add (const nlib_utf8_t *path, MpObject *value) noexcept
 JSON Patch文書となる配列に"add"演算を追加します。 [詳解]
 
errno_t Add (const nlib_utf8_t *path, MpObject &&value) noexcept
 JSON Patch文書となる配列に"add"演算を追加します。 [詳解]
 
errno_t Remove (const nlib_utf8_t *path) noexcept
 JSON Patch文書となる配列に"remove"演算を追加します。 [詳解]
 
errno_t Replace (const nlib_utf8_t *path, MpObject *value) noexcept
 JSON Patch文書となる配列に"replace"演算を追加します。 [詳解]
 
errno_t Replace (const nlib_utf8_t *path, MpObject &&value) noexcept
 JSON Patch文書となる配列に"replace"演算を追加します。 [詳解]
 
errno_t Move (const nlib_utf8_t *path, const nlib_utf8_t *from) noexcept
 JSON Patch文書となる配列に"move"演算を追加します。 [詳解]
 
errno_t Copy (const nlib_utf8_t *path, const nlib_utf8_t *from) noexcept
 JSON Patch文書となる配列に"copy"演算を追加します。 [詳解]
 
errno_t Test (const nlib_utf8_t *path, MpObject *value) noexcept
 JSON Patch文書となる配列に"test"演算を追加します。 [詳解]
 
errno_t Test (const nlib_utf8_t *path, MpObject &&value) noexcept
 JSON Patch文書となる配列に"test"演算を追加します。 [詳解]
 
errno_t Export (MpObject *patch) noexcept
 JSON PatchとなるJSONドキュメントを取り出します。 [詳解]
 
std::pair< errno_t, std::unique_ptr< MpObject > > Export () noexcept
 JSON PatchとなるJSONドキュメントをMpObjectの形式で取り出します。 [詳解]
 
コンストラクタ、デストラクタ、及び初期化
 JsonPatchBuilder () noexcept
 デフォルトコンストラクタです。
 
 ~JsonPatchBuilder () noexcept
 デストラクタです。
 
 JsonPatchBuilder (JsonPatchBuilder &&rhs)=default
 ムーブコンストラクタです。
 
JsonPatchBuilderoperator= (JsonPatchBuilder &&rhs)=default
 ムーブ代入演算子です。
 

詳解

JSON Patch (RFC-6902)を作成するためのクラスです。

説明
オブジェクトを構築して、Add(), Remove(), Replace(), Move(), Copy(), Test()を用いてJSON Patchドキュメントを構築します。 それぞれのメンバ関数は、RFC-6902で定められている"add", "remove", "replace", "move", "copy", "test"演算に対応します。 JSON Patchドキュメントを構築できたら、Export()MpObjectとして出力します。 出力されたJSON Patchドキュメントは、JsonPatch::Apply()を用いて適用することができます。
以下はJsonPatchBuilderを利用して構築したJSON PatchをJSONドキュメントに適用するコード例です。
{
MpObject v;
SUCCEED_IF(v.InitString("foo") == 0);
SUCCEED_IF(builder.Test("/a/b/c", std::move(v)) == 0);
}
builder.Remove("/a/b/c");
{
MpObject v;
SUCCEED_IF(v.InitArray(2) == 0);
SUCCEED_IF(v[0].InitString("foo") == 0);
SUCCEED_IF(v[1].InitString("bar") == 0);
SUCCEED_IF(builder.Add("/a/b/c", std::move(v)) == 0);
}
{
MpObject v(42);
SUCCEED_IF(builder.Replace("/a/b/c", std::move(v)) == 0);
}
SUCCEED_IF(builder.Move("/a/b/d", "/a/b/c") == 0);
SUCCEED_IF(builder.Copy("/a/b/e", "/a/b/d") == 0);
auto r = builder.Export();
SUCCEED_IF(r.first == 0);
ToJson(buf, *r.second);
nlib_printf("%s\n", buf);
auto obj = ToMpObject(R"({"a": {"b" : {"c" : "foo"}}})");
SUCCEED_IF(JsonPatch::Apply(obj.get(), r.second.get(), nullptr) == 0);
ToJson(buf, *obj);
nlib_printf("%s\n", buf);
/*
Output:
[{"op":"test","path":"\/a\/b\/c","value":"foo"},
{"op":"remove","path":"\/a\/b\/c"},
{"op":"add","path":"\/a\/b\/c","value":["foo","bar"]},
{"op":"replace","path":"\/a\/b\/c","value":42},
{"op":"move","from":"\/a\/b\/c","path":"\/a\/b\/d"},
{"op":"copy","from":"\/a\/b\/d","path":"\/a\/b\/e"}]
{"a":{"b":{"d":42,"e":42}}}
*/
参照
https://tools.ietf.org/html/rfc6902
https://triple-underscore.github.io/RFC6902-ja.html

JsonPatch.h30 行目に定義があります。

関数詳解

◆ Add() [1/2]

nn::nlib::msgpack::JsonPatchBuilder::Add ( const nlib_utf8_t path,
MpObject value 
)
inlinenoexcept

JSON Patch文書となる配列に"add"演算を追加します。

引数
[in]pathvalueが設定されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value設定される値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"add"演算はpathが指し示すJSONドキュメント内の場所に対して以下の演算のいずれかを実行します。
  • pathが空文字列であった場合、JSONドキュメント全体をvalueに置換する。
  • pathが配列のインデックスを指し示している場合、そこに新たにvalueを挿入する。 配列の末尾か'-'を示している場合、valueは配列の末尾に追加される。
  • pathの末尾のキーが存在しない場合は、そこに新たにvalueがキーで参照される値として追加される。
  • pathに対応する値が存在する場合、その値がvalueに置換される。

JsonPatch.h52 行目に定義があります。

◆ Add() [2/2]

nn::nlib::msgpack::JsonPatchBuilder::Add ( const nlib_utf8_t path,
MpObject &&  value 
)
inlinenoexcept

JSON Patch文書となる配列に"add"演算を追加します。

引数
[in]pathvalueが設定されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value設定される値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"add"演算はpathが指し示すJSONドキュメント内の場所に対して以下の演算のいずれかを実行します。
  • pathが空文字列であった場合、JSONドキュメント全体をvalueに置換する。
  • pathが配列のインデックスを指し示している場合、そこに新たにvalueを挿入する。 配列の末尾か'-'を示している場合、valueは配列の末尾に追加される。
  • pathの末尾のキーが存在しない場合は、そこに新たにvalueがキーで参照される値として追加される。
  • pathに対応する値が存在する場合、その値がvalueに置換される。

JsonPatch.h56 行目に定義があります。

◆ Copy()

nn::nlib::msgpack::JsonPatchBuilder::Copy ( const nlib_utf8_t path,
const nlib_utf8_t from 
)
inlinenoexcept

JSON Patch文書となる配列に"copy"演算を追加します。

引数
[in]pathコピー先のJSONドキュメント内の場所を示したJSON Pointer文字列
[in]fromコピー元のJSONドキュメント内の場所を示したJSON Pointer文字列
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"copy"演算は、fromにより指定される値を、pathを指定して"add"演算で追加する動作を行います。 この演算が実行される直前に、操作対象のJSONドキュメント内にfromに対応する場所が存在している必要があります。

JsonPatch.h73 行目に定義があります。

◆ Export() [1/2]

nn::nlib::msgpack::JsonPatchBuilder::Export ( MpObject patch)
noexcept

JSON PatchとなるJSONドキュメントを取り出します。

引数
[in]patchJSON PatchとなるJSONドキュメントが格納されるMpObject
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
取り出したJSON Patchドキュメントはpatchに格納されます。 patchに格納されていたデータは削除され、JsonPatchBuilderはコンストラクタ実行直後と同じ状態になります。 ENOMEMは、演算を何も追加していない場合のみに返される可能性があります。

◆ Export() [2/2]

nn::nlib::msgpack::JsonPatchBuilder::Export ( )
noexcept

JSON PatchとなるJSONドキュメントをMpObjectの形式で取り出します。

戻り値
エラー値とJSON PatchとなるJSONドキュメントのペア
説明
エラー値が0の場合は、ユニークポインタに有効なMpObjectが格納されています。 内部でのメモリの確保に失敗した場合、エラー値にはENOMEMが設定されます。

◆ Move()

nn::nlib::msgpack::JsonPatchBuilder::Move ( const nlib_utf8_t path,
const nlib_utf8_t from 
)
inlinenoexcept

JSON Patch文書となる配列に"move"演算を追加します。

引数
[in]path移動先のJSONドキュメント内の場所を示したJSON Pointer文字列
[in]from移動元のJSONドキュメント内の場所を示したJSON Pointer文字列
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"move"演算は、fromを指定して"remove"演算を行って削除した値を、pathを指定して"add"演算で追加する動作を行います。 この演算が実行される直前に、操作対象のJSONドキュメント内にfromに対応する場所が存在している必要があります。

JsonPatch.h69 行目に定義があります。

◆ Remove()

nn::nlib::msgpack::JsonPatchBuilder::Remove ( const nlib_utf8_t path)
noexcept

JSON Patch文書となる配列に"remove"演算を追加します。

引数
[in]path削除されるJSONドキュメント内の場所を示したJSON Pointer文字列
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"remove"演算はpathが指し示すJSONドキュメント内の場所を削除します。 この演算が実行される直前に、操作対象のJSONドキュメント内にpathに対応する場所が存在している必要があります。 詳細は以下の通りです。
  • pathが空文字列であった場合、JSONドキュメント全体を削除する。
  • pathが配列のインデックスを指し示している場合、指定されたインデックスより先の要素は1つずつ前へずらす。
  • それ以外の場合、pathで指定される値と、その値を直接指し示すキーを取り除く。

◆ Replace() [1/2]

nn::nlib::msgpack::JsonPatchBuilder::Replace ( const nlib_utf8_t path,
MpObject value 
)
inlinenoexcept

JSON Patch文書となる配列に"replace"演算を追加します。

引数
[in]pathvalueが設定されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value設定される値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"replace"演算は、pathが指し示すJSONドキュメント内の場所の値をvalueで置き換えます。 この演算は、"remove"演算の直後に同じ場所に対して"add"演算を行うのと機能的に同じです。

JsonPatch.h61 行目に定義があります。

◆ Replace() [2/2]

nn::nlib::msgpack::JsonPatchBuilder::Replace ( const nlib_utf8_t path,
MpObject &&  value 
)
inlinenoexcept

JSON Patch文書となる配列に"replace"演算を追加します。

引数
[in]pathvalueが設定されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value設定される値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"replace"演算は、pathが指し示すJSONドキュメント内の場所の値をvalueで置き換えます。 この演算は、"remove"演算の直後に同じ場所に対して"add"演算を行うのと機能的に同じです。

JsonPatch.h65 行目に定義があります。

◆ Test() [1/2]

nn::nlib::msgpack::JsonPatchBuilder::Test ( const nlib_utf8_t path,
MpObject value 
)
inlinenoexcept

JSON Patch文書となる配列に"test"演算を追加します。

引数
[in]path演算が実行されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value比較対象となる値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"test"演算は、pathにより指定される値とvalueを比較します。 両者がJSONとして等価である場合に"test"演算が成功します。

JsonPatch.h77 行目に定義があります。

◆ Test() [2/2]

nn::nlib::msgpack::JsonPatchBuilder::Test ( const nlib_utf8_t path,
MpObject &&  value 
)
inlinenoexcept

JSON Patch文書となる配列に"test"演算を追加します。

引数
[in]path演算が実行されるJSONドキュメント内の場所を示したJSON Pointer文字列
[in]value比較対象となる値
戻り値
0成功した場合
ENOMEMメモリ割り当てに失敗した場合
説明
"test"演算は、pathにより指定される値とvalueを比較します。 両者がJSONとして等価である場合に"test"演算が成功します。

JsonPatch.h81 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: