From e170fbc0fc92ae0d0a639d760e345f76df1fc8ff Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 25 Sep 2021 00:27:55 -0500 Subject: [PATCH] Use `FeatureSet` struct --- src/AWS.jl | 27 ++++++++++++------------ src/api_generation/high_level.jl | 36 ++++++++++++++++---------------- src/utilities/utilities.jl | 33 ++++++++--------------------- test/AWSMetadataUtilities.jl | 20 +++++++++--------- test/utilities.jl | 36 ++++++++++---------------------- 5 files changed, 62 insertions(+), 90 deletions(-) diff --git a/src/AWS.jl b/src/AWS.jl index bf0cfed0cb..323ca97fb4 100644 --- a/src/AWS.jl +++ b/src/AWS.jl @@ -23,7 +23,6 @@ export sign!, sign_aws2!, sign_aws4! export JSONService, RestJSONService, RestXMLService, QueryService, set_features const DEFAULT_REGION = "us-east-1" -const DEFAULT_SERVICE_FEATURES = NamedTuple() include(joinpath("utilities", "utilities.jl")) @@ -42,6 +41,8 @@ using ..AWSExceptions: AWSException const user_agent = Ref("AWS.jl/1.0.0") const aws_config = Ref{AbstractAWSConfig}() +Base.@kwdef struct FeatureSet end + """ global_aws_config() @@ -125,10 +126,11 @@ using AWS: @service """ macro service(module_name::Symbol, features...) service_name = joinpath(@__DIR__, "services", lowercase(string(module_name)) * ".jl") - service_features = _process_service_features(features, DEFAULT_SERVICE_FEATURES) + map(_assignment_to_kw!, features) module_block = quote - const SERVICE_FEATURES = $service_features + using AWS: FeatureSet + const SERVICE_FEATURE_SET = FeatureSet(; $(features...)) include($service_name) end @@ -174,12 +176,11 @@ end struct ServiceWrapper{S<:Service} service::S - features::NamedTuple + feature_set::FeatureSet end function set_features(service::Service; features...) - features = merge(DEFAULT_SERVICE_FEATURES, features) - return ServiceWrapper(service, features) + return ServiceWrapper(service, FeatureSet(; features...)) end # Needs to be included after the definition of struct otherwise it cannot find them @@ -224,7 +225,7 @@ function (service::RestXMLService)( request_uri::String, args::AbstractDict{String,<:Any}=Dict{String,Any}(); aws_config::AbstractAWSConfig=global_aws_config(), - features::NamedTuple=DEFAULT_SERVICE_FEATURES, + feature_set::FeatureSet=FeatureSet(), ) return_headers = _pop!(args, "return_headers", false) @@ -277,7 +278,7 @@ function (service::QueryService)( operation::String, args::AbstractDict{String,<:Any}=Dict{String,Any}(); aws_config::AbstractAWSConfig=global_aws_config(), - features::NamedTuple=DEFAULT_SERVICE_FEATURES, + feature_set::FeatureSet=FeatureSet(), ) POST_RESOURCE = "/" return_headers = _pop!(args, "return_headers", false) @@ -320,7 +321,7 @@ function (service::JSONService)( operation::String, args::AbstractDict{String,<:Any}=Dict{String,Any}(); aws_config::AbstractAWSConfig=global_aws_config(), - features::NamedTuple=DEFAULT_SERVICE_FEATURES, + feature_set::FeatureSet=FeatureSet(), ) POST_RESOURCE = "/" return_headers = _pop!(args, "return_headers", false) @@ -363,7 +364,7 @@ function (service::RestJSONService)( request_uri::String, args::AbstractDict{String,<:Any}=Dict{String,String}(); aws_config::AbstractAWSConfig=global_aws_config(), - features::NamedTuple=DEFAULT_SERVICE_FEATURES, + feature_set::FeatureSet=FeatureSet(), ) return_headers = _pop!(args, "return_headers", false) @@ -387,9 +388,9 @@ function (service::RestJSONService)( return submit_request(aws_config, request; return_headers=return_headers) end -function (service::ServiceWrapper)(args...; features::NamedTuple=NamedTuple(), kwargs...) - features = merge(service.features, features) - return service.service(args...; features=features, kwargs...) +function (service::ServiceWrapper)(args...; feature_set=nothing, kwargs...) + feature_set = something(feature_set, service.feature_set) + return service.service(args...; feature_set=feature_set, kwargs...) end function __init__() diff --git a/src/api_generation/high_level.jl b/src/api_generation/high_level.jl index b91575c6fa..e1961fb7ca 100644 --- a/src/api_generation/high_level.jl +++ b/src/api_generation/high_level.jl @@ -144,28 +144,28 @@ function _generate_high_level_definition( if required_keys && (idempotent || headers) return """ - $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $params_headers_str; aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $params_headers_str, params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $params_headers_str; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $params_headers_str, params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ elseif !required_keys && (idempotent || headers) return """ - $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $params_headers_str; aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $params_headers_str, params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $params_headers_str; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $params_headers_str, params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ elseif required_keys && !isempty(req_kv) return """ - $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $req_str); aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $req_str), params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", $req_str); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", Dict{String, Any}(mergewith(_merge, $req_str), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ elseif required_keys return """ - $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\"; aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", params; aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\"; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", params; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ else return """ - $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\"; aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", params; aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\"; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$method\", \"$request_uri\", params; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ end end @@ -193,23 +193,23 @@ function _generate_high_level_definition( if required && idempotent return """ - $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(req_kv, ", ")), $(join(idempotent_kv, ", "))); aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(req_kv, ", ")), $(join(idempotent_kv, ", "))), params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(req_kv, ", ")), $(join(idempotent_kv, ", "))); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(req_kv, ", ")), $(join(idempotent_kv, ", "))), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ elseif required return """ - $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(req_kv, ", "))); aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(req_kv, ", "))), params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name($(join(req_keys, ", ")); aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(req_kv, ", "))); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name($(join(req_keys, ", ")), params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(req_kv, ", "))), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ elseif idempotent return """ - $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(idempotent_kv, ", "))); aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(idempotent_kv, ", "))), params)); aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}($(join(idempotent_kv, ", "))); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", Dict{String, Any}(mergewith(_merge, Dict{String, Any}($(join(idempotent_kv, ", "))), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ else return """ - $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\"; aws_config=aws_config, features=SERVICE_FEATURES) - $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", params; aws_config=aws_config, features=SERVICE_FEATURES) + $formatted_function_name(; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\"; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + $formatted_function_name(params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = $service_name(\"$function_name\", params; aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ end end diff --git a/src/utilities/utilities.jl b/src/utilities/utilities.jl index 3a62176c12..a9321f08b7 100644 --- a/src/utilities/utilities.jl +++ b/src/utilities/utilities.jl @@ -104,31 +104,16 @@ function _generate_rest_resource(request_uri::String, args::AbstractDict{String, return request_uri end -# Take a list of user defined features, `key=value` expressions, and verifies that all of -# the keys are defined within `defaults`. If any key is not defined by the user then the -# value from `defaults` will be used. Returns a `NamedTuple` expression. -function _process_service_features(args, defaults) - feature_dict = Dict{Symbol,Any}(pairs(defaults)) - for ex in args - if ex isa Expr && ex.head === :(=) - k, v = ex.args[1:2] - if haskey(feature_dict, k) - feature_dict[k] = v - else - throw(ArgumentError("Unsupported feature `$ex` specified")) - end - else - throw(ArgumentError("Expected feature, instead found: `$ex`")) - end - end - - # Turn the feature dictionary into a `NamedTuple` expression. Note: Julia 1.4 and below - # do not support `:((;))`. - nt = if !isempty(feature_dict) - Expr(:tuple, Expr(:parameters, [Expr(:kw, p...) for p in feature_dict]...)) +function _assignment_to_kw!(expr::Expr) + if expr.head === :(=) + expr.head = :kw else - :(NamedTuple()) + throw(ArgumentError("Expected assignment expression, instead found: `$expr`")) end - return nt + return expr +end + +function _assignment_to_kw!(x) + throw(ArgumentError("Expected assignment expression, instead found: `$x`")) end diff --git a/test/AWSMetadataUtilities.jl b/test/AWSMetadataUtilities.jl index 2307a7b39b..f9eeea2f69 100644 --- a/test/AWSMetadataUtilities.jl +++ b/test/AWSMetadataUtilities.jl @@ -327,8 +327,8 @@ end Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are: - `"OptionalParam"`: Optional param \"\"\" - sample_operation(RequiredParam1, RequiredParam2; aws_config::AbstractAWSConfig=global_aws_config()) = sample_service("POST", "/", Dict{String, Any}("RequiredParam1"=>RequiredParam1, "RequiredParam2"=>RequiredParam2); aws_config=aws_config, features=SERVICE_FEATURES) - sample_operation(RequiredParam1, RequiredParam2, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = sample_service("POST", "/", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam1"=>RequiredParam1, "RequiredParam2"=>RequiredParam2), params)); aws_config=aws_config, features=SERVICE_FEATURES) + sample_operation(RequiredParam1, RequiredParam2; aws_config::AbstractAWSConfig=global_aws_config()) = sample_service("POST", "/", Dict{String, Any}("RequiredParam1"=>RequiredParam1, "RequiredParam2"=>RequiredParam2); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + sample_operation(RequiredParam1, RequiredParam2, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = sample_service("POST", "/", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam1"=>RequiredParam1, "RequiredParam2"=>RequiredParam2), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ result = _generate_high_level_definitions(service_name, protocol, operations, shapes) @@ -375,8 +375,8 @@ end Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are: - `"OptionalParam"`: This parameter is optional. \"\"\" - function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}("RequiredParam"=>RequiredParam); aws_config=aws_config, features=SERVICE_FEATURES) - function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam), params)); aws_config=aws_config, features=SERVICE_FEATURES) + function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}("RequiredParam"=>RequiredParam); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ result = _generate_high_level_definition( @@ -412,8 +412,8 @@ end Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are: - `"OptionalParam"`: This parameter is optional. \"\"\" - function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}("RequiredParam"=>RequiredParam); aws_config=aws_config, features=SERVICE_FEATURES) - function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam), params)); aws_config=aws_config, features=SERVICE_FEATURES) + function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}("RequiredParam"=>RequiredParam); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ result = _generate_high_level_definition( @@ -462,8 +462,8 @@ end Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are: - `"OptionalParam"`: This parameter i s optional. \"\"\" - function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}("OptionalParam"=>string(uuid4()), "headers"=>Dict{String, Any}("RequiredParam"=>RequiredParam)); aws_config=aws_config, features=SERVICE_FEATURES) - function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("OptionalParam"=>string(uuid4()), "headers"=>Dict{String, Any}("RequiredParam"=>RequiredParam)), params)); aws_config=aws_config, features=SERVICE_FEATURES) + function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}("OptionalParam"=>string(uuid4()), "headers"=>Dict{String, Any}("RequiredParam"=>RequiredParam)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("GET", "request_uri", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("OptionalParam"=>string(uuid4()), "headers"=>Dict{String, Any}("RequiredParam"=>RequiredParam)), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ result = _generate_high_level_definition( service_name, @@ -498,8 +498,8 @@ end Optional parameters can be passed as a `params::Dict{String,<:Any}`. Valid keys are: - `"OptionalParam"`: This parameter i s optional. \"\"\" - function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}("RequiredParam"=>RequiredParam, "OptionalParam"=>string(uuid4())); aws_config=aws_config, features=SERVICE_FEATURES) - function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam, "OptionalParam"=>string(uuid4())), params)); aws_config=aws_config, features=SERVICE_FEATURES) + function_name(RequiredParam; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}("RequiredParam"=>RequiredParam, "OptionalParam"=>string(uuid4())); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) + function_name(RequiredParam, params::AbstractDict{String}; aws_config::AbstractAWSConfig=global_aws_config()) = service_name("FunctionName", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("RequiredParam"=>RequiredParam, "OptionalParam"=>string(uuid4())), params)); aws_config=aws_config, feature_set=SERVICE_FEATURE_SET) """ result = _generate_high_level_definition( diff --git a/test/utilities.jl b/test/utilities.jl index d41c494041..f444983d93 100644 --- a/test/utilities.jl +++ b/test/utilities.jl @@ -62,34 +62,20 @@ end @test AWS._merge("a", "b") == expected end -@testset "_process_service_features" begin - @testset "use default" begin - user_feats = [] - default_feats = (; a=false) - @test AWS._process_service_features(user_feats, default_feats) == :((; a=false)) +@testset "_assignment_to_kw!" begin + @testset "non-expression" begin + ex = :(true) + @test_throws ArgumentError AWS._assignment_to_kw!(ex) end - @testset "user set" begin - user_feats = [:(a = true)] - default_feats = (; a=false) - @test AWS._process_service_features(user_feats, default_feats) == :((; a=true)) + @testset "non-assignment" begin + ex = :(a => true) + @test_throws ArgumentError AWS._assignment_to_kw!(ex) end - @testset "unknown feature" begin - user_feats = [:(b = true)] - default_feats = (; a=false) - @test_throws ArgumentError AWS._process_service_features(user_feats, default_feats) - end - - @testset "unknown expression" begin - user_feats = [:(true)] - default_feats = (; a=false) - @test_throws ArgumentError AWS._process_service_features(user_feats, default_feats) - end - - @testset "no defaults" begin - user_feats = [] - default_feats = NamedTuple() - @test AWS._process_service_features(user_feats, default_feats) == :(NamedTuple()) + @testset "assignment" begin + ex = :(a = true) + @test AWS._assignment_to_kw!(ex) == Expr(:kw, :a, true) + @test ex == Expr(:kw, :a, true) end end