4
4
#ifndef TAOCPP_JSON_INCLUDE_PATCH_HH
5
5
#define TAOCPP_JSON_INCLUDE_PATCH_HH
6
6
7
+ #include < stdexcept>
8
+ #include < utility>
9
+
7
10
#include " value.hh"
8
11
#include " json_pointer.hh"
9
12
@@ -14,73 +17,73 @@ namespace tao
14
17
template < template < typename ... > class Traits >
15
18
void patch_inplace ( basic_value< Traits > & value, const basic_value< Traits > & patch )
16
19
{
17
- for ( const auto & entry : patch.get_array () ) {
18
- const auto & op = entry.at ( " op" ).get_string ();
19
- const json_pointer path ( entry.at ( " path" ).get_string () );
20
- if ( op == " test" ) {
21
- if ( value.at ( path ) != entry.at ( " value" ) ) {
22
- throw std::runtime_error ( " test failed for: " + path.value () );
20
+ for ( const auto & entry : patch.get_array () ) {
21
+ const auto & op = entry.at ( " op" ).get_string ();
22
+ const json_pointer path ( entry.at ( " path" ).get_string () );
23
+ if ( op == " test" ) {
24
+ if ( value.at ( path ) != entry.at ( " value" ) ) {
25
+ throw std::runtime_error ( " test failed for: " + path.value () );
26
+ }
27
+ }
28
+ else if ( op == " remove" ) {
29
+ value.erase ( path );
30
+ }
31
+ else if ( op == " add" ) {
32
+ value.insert ( path, entry.at ( " value" ) );
33
+ }
34
+ else if ( op == " replace" ) {
35
+ value.at ( path ) = entry.at ( " value" );
36
+ }
37
+ else if ( op == " move" ) {
38
+ const json_pointer from ( entry.at ( " from" ).get_string () );
39
+ auto v = std::move ( value.at ( from ) );
40
+ value.erase ( from );
41
+ value.insert ( path, std::move ( v ) );
42
+ }
43
+ else if ( op == " copy" ) {
44
+ const json_pointer from ( entry.at ( " from" ).get_string () );
45
+ value.insert ( path, value.at ( from ) );
46
+ }
47
+ else {
48
+ throw std::runtime_error ( " unknown patch operation: '" + op + ' \' ' );
23
49
}
24
- }
25
- else if ( op == " remove" ) {
26
- value.erase ( path );
27
- }
28
- else if ( op == " add" ) {
29
- value.insert ( path, entry.at ( " value" ) );
30
- }
31
- else if ( op == " replace" ) {
32
- value.at ( path ) = entry.at ( " value" );
33
- }
34
- else if ( op == " move" ) {
35
- const json_pointer from ( entry.at ( " from" ).get_string () );
36
- auto v = std::move ( value.at ( from ) );
37
- value.erase ( from );
38
- value.insert ( path, std::move ( v ) );
39
- }
40
- else if ( op == " copy" ) {
41
- const json_pointer from ( entry.at ( " from" ).get_string () );
42
- value.insert ( path, value.at ( from ) );
43
- }
44
- else {
45
- throw std::runtime_error ( " unknown patch operation: '" + op + ' \' ' );
46
- }
47
- }
50
+ }
48
51
}
49
52
50
53
template < template < typename ... > class Traits >
51
54
void patch_inplace ( basic_value< Traits > & value, basic_value< Traits > && patch )
52
55
{
53
- for ( const auto & entry : patch.get_array () ) {
54
- const auto & op = entry.at ( " op" ).get_string ();
55
- const json_pointer path ( entry.at ( " path" ).get_string () );
56
- if ( op == " test" ) {
57
- if ( value.at ( path ) != entry.at ( " value" ) ) {
58
- throw std::runtime_error ( " test failed for: " + path.value () );
56
+ for ( const auto & entry : patch.get_array () ) {
57
+ const auto & op = entry.at ( " op" ).get_string ();
58
+ const json_pointer path ( entry.at ( " path" ).get_string () );
59
+ if ( op == " test" ) {
60
+ if ( value.at ( path ) != entry.at ( " value" ) ) {
61
+ throw std::runtime_error ( " test failed for: " + path.value () );
62
+ }
63
+ }
64
+ else if ( op == " remove" ) {
65
+ value.erase ( path );
66
+ }
67
+ else if ( op == " add" ) {
68
+ value.insert ( path, std::move ( entry.at ( " value" ) ) );
69
+ }
70
+ else if ( op == " replace" ) {
71
+ value.at ( path ) = std::move ( entry.at ( " value" ) );
72
+ }
73
+ else if ( op == " move" ) {
74
+ const json_pointer from ( entry.at ( " from" ).get_string () );
75
+ auto v = std::move ( value.at ( from ) );
76
+ value.erase ( from );
77
+ value.insert ( path, std::move ( v ) );
78
+ }
79
+ else if ( op == " copy" ) {
80
+ const json_pointer from ( entry.at ( " from" ).get_string () );
81
+ value.insert ( path, value.at ( from ) );
82
+ }
83
+ else {
84
+ throw std::runtime_error ( " unknown patch operation: '" + op + ' \' ' );
59
85
}
60
- }
61
- else if ( op == " remove" ) {
62
- value.erase ( path );
63
- }
64
- else if ( op == " add" ) {
65
- value.insert ( path, std::move ( entry.at ( " value" ) ) );
66
- }
67
- else if ( op == " replace" ) {
68
- value.at ( path ) = std::move ( entry.at ( " value" ) );
69
- }
70
- else if ( op == " move" ) {
71
- const json_pointer from ( entry.at ( " from" ).get_string () );
72
- auto v = std::move ( value.at ( from ) );
73
- value.erase ( from );
74
- value.insert ( path, std::move ( v ) );
75
- }
76
- else if ( op == " copy" ) {
77
- const json_pointer from ( entry.at ( " from" ).get_string () );
78
- value.insert ( path, value.at ( from ) );
79
- }
80
- else {
81
- throw std::runtime_error ( " unknown patch operation: '" + op + ' \' ' );
82
- }
83
- }
86
+ }
84
87
}
85
88
86
89
template < template < typename ... > class Traits >
0 commit comments