@@ -70,14 +70,9 @@ defimpl Jsonpatch.Operation, for: Jsonpatch.Operation.Copy do
7070 { :error , :invalid_index , fragment }
7171
7272 { index , _ } ->
73- result =
74- final_destination
75- |> Enum . with_index ( )
76- |> Enum . find ( fn { _ , other_index } -> index == other_index end )
77-
78- case result do
79- nil -> { :error , :invalid_index , fragment }
80- { val , _ } -> val
73+ case Enum . fetch ( final_destination , index ) do
74+ :error -> { :error , :invalid_index , fragment }
75+ { :ok , val } -> val
8176 end
8277 end
8378 end
@@ -88,12 +83,20 @@ defimpl Jsonpatch.Operation, for: Jsonpatch.Operation.Copy do
8883
8984 defp do_add ( { copy_target , _last_fragment } , copied_value , copy_path_end )
9085 when is_list ( copy_target ) do
91- case Integer . parse ( copy_path_end ) do
92- :error ->
93- { :error , :invalid_index , copy_path_end }
94-
95- { index , _ } ->
96- List . insert_at ( copy_target , index , copied_value )
86+ if copy_path_end == "-" do
87+ List . insert_at ( copy_target , length ( copy_target ) , copied_value )
88+ else
89+ case Integer . parse ( copy_path_end ) do
90+ :error ->
91+ { :error , :invalid_index , copy_path_end }
92+
93+ { index , _ } ->
94+ if index < length ( copy_target ) do
95+ List . update_at ( copy_target , index , fn _old -> copied_value end )
96+ else
97+ { :error , :invalid_index , copy_path_end }
98+ end
99+ end
97100 end
98101 end
99102
0 commit comments