Skip to content

Commit 8d648bd

Browse files
quinnjclaude
andcommitted
add get methods for cross-key-type support on Object
Completes String/Symbol interoperability for Object by adding get methods that accept cross-key-types: - get(f::Callable, obj::Object{String}, key::Symbol) - get(f::Callable, obj::Object{Symbol}, key::String) - get(obj::Object{String}, key::Symbol, default) - get(obj::Object{Symbol}, key::String, default) This follows up on #421 which added setindex!, delete!, and haskey for cross-key-types. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 738fda9 commit 8d648bd

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

src/object.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ function Base.get(f::Base.Callable, obj::Object{K,V}, key) where {K,V}
136136
node !== nothing && return _v(node)::V
137137
return f()
138138
end
139+
Base.get(f::Base.Callable, obj::Object{String}, key::Symbol) = get(f, obj, String(key))
140+
Base.get(f::Base.Callable, obj::Object{Symbol}, key::String) = get(f, obj, Symbol(key))
139141

140142
Base.getindex(obj::Object, key) = get(() -> throw(KeyError(key)), obj, key)
141143
Base.getindex(obj::Object{String}, key::Symbol) = get(() -> throw(KeyError(key)), obj, String(key))
@@ -145,6 +147,8 @@ Base.setindex!(obj::Object{Symbol}, value, key::String) = setindex!(obj, value,
145147
Base.delete!(obj::Object{String}, key::Symbol) = delete!(obj, String(key))
146148
Base.delete!(obj::Object{Symbol}, key::String) = delete!(obj, Symbol(key))
147149
Base.get(obj::Object, key, default) = get(() -> default, obj, key)
150+
Base.get(obj::Object{String}, key::Symbol, default) = get(obj, String(key), default)
151+
Base.get(obj::Object{Symbol}, key::String, default) = get(obj, Symbol(key), default)
148152

149153
# support getproperty for dot access
150154
Base.getproperty(obj::Object{Symbol}, sym::Symbol) = getindex(obj, sym)

test/object.jl

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,14 @@ using JSON, Test
279279
delete!(obj, :symbol_test)
280280
@test !haskey(obj, :symbol_test)
281281
@test !haskey(obj, "symbol_test")
282-
282+
283+
# Test get with Symbol key (should convert to String)
284+
obj["get_test"] = "got it"
285+
@test get(obj, :get_test, "default") == "got it"
286+
@test get(obj, :nonexistent, "default") == "default"
287+
@test get(() -> "fallback", obj, :get_test) == "got it"
288+
@test get(() -> "fallback", obj, :nonexistent) == "fallback"
289+
283290
# Test with empty object
284291
empty_obj = JSON.Object{String, Any}()
285292
@test !haskey(empty_obj, :anything)
@@ -319,6 +326,13 @@ using JSON, Test
319326
@test !haskey(obj, :symbol_test)
320327
@test !haskey(obj, "symbol_test")
321328

329+
# Test get with String key (should convert to Symbol)
330+
obj[:get_test] = "got it"
331+
@test get(obj, "get_test", "default") == "got it"
332+
@test get(obj, "nonexistent", "default") == "default"
333+
@test get(() -> "fallback", obj, "get_test") == "got it"
334+
@test get(() -> "fallback", obj, "nonexistent") == "fallback"
335+
322336
# Test with empty object
323337
empty_obj = JSON.Object{Symbol, Any}()
324338
@test !haskey(empty_obj, :anything)

0 commit comments

Comments
 (0)