From 2ae90ae696b2a49e70955450b0b57fcf54f15f44 Mon Sep 17 00:00:00 2001 From: James Aimonetti Date: Thu, 9 Apr 2020 11:54:20 -0700 Subject: [PATCH] [4.3] KCRO-21: correct classifiers schema to include classifier name (#6459) --- applications/crossbar/doc/ref/resources.md | 13 +- applications/crossbar/doc/resources.md | 13 +- applications/crossbar/priv/api/swagger.json | 33 ----- .../priv/couchdb/schemas/resources.json | 67 +++++----- .../stepswitch/src/stepswitch_resources.erl | 28 ++-- core/kazoo_documents/src/kzd_resources.erl | 120 +++++++++--------- .../kazoo_documents/src/kzd_resources.erl.src | 85 ++----------- 7 files changed, 135 insertions(+), 224 deletions(-) diff --git a/applications/crossbar/doc/ref/resources.md b/applications/crossbar/doc/ref/resources.md index 06e65073358..b5e8f083d15 100644 --- a/applications/crossbar/doc/ref/resources.md +++ b/applications/crossbar/doc/ref/resources.md @@ -14,12 +14,13 @@ Key | Description | Type | Default | Required | Support Level `caller_id_options` | Caller ID options | `object()` | | `false` | `cid_rules.[]` | | `string()` | | `false` | `cid_rules` | Regexps to match against caller ID | `array(string())` | | `false` | -`classifiers.emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | -`classifiers.enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | -`classifiers.prefix` | A string to prepend to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | -`classifiers.regex` | regexp to match against dialed number | `string()` | | `false` | -`classifiers.suffix` | A string to append to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | -`classifiers.weight_cost` | A value between 0 and 100 that determines the order of resources when multiple can be used | `integer()` | `50` | `false` | +`classifiers./.+/.emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | +`classifiers./.+/.enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | +`classifiers./.+/.prefix` | A string to prepend to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | +`classifiers./.+/.regex` | regexp to match against dialed number | `string()` | | `false` | +`classifiers./.+/.suffix` | A string to append to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | +`classifiers./.+/.weight_cost` | A value between 0 and 100 that determines the order of resources when multiple can be used | `integer()` | `50` | `false` | +`classifiers./.+/` | | `object()` | | `false` | `classifiers` | Resource classifiers to use as rules when matching against dialed numbers | `object()` | | `false` | `emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | `enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | diff --git a/applications/crossbar/doc/resources.md b/applications/crossbar/doc/resources.md index 60f4572bd12..81a67fb25ed 100644 --- a/applications/crossbar/doc/resources.md +++ b/applications/crossbar/doc/resources.md @@ -32,12 +32,13 @@ Key | Description | Type | Default | Required | Support Level `caller_id_options` | Caller ID options | `object()` | | `false` | `cid_rules.[]` | | `string()` | | `false` | `cid_rules` | Regexps to match against caller ID | `array(string())` | | `false` | -`classifiers.emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | -`classifiers.enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | -`classifiers.prefix` | A string to prepend to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | -`classifiers.regex` | regexp to match against dialed number | `string()` | | `false` | -`classifiers.suffix` | A string to append to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | -`classifiers.weight_cost` | A value between 0 and 100 that determines the order of resources when multiple can be used | `integer()` | `50` | `false` | +`classifiers./.+/.emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | +`classifiers./.+/.enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | +`classifiers./.+/.prefix` | A string to prepend to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | +`classifiers./.+/.regex` | regexp to match against dialed number | `string()` | | `false` | +`classifiers./.+/.suffix` | A string to append to the dialed number or capture group of the matching rule | `string(0..64)` | | `false` | +`classifiers./.+/.weight_cost` | A value between 0 and 100 that determines the order of resources when multiple can be used | `integer()` | `50` | `false` | +`classifiers./.+/` | | `object()` | | `false` | `classifiers` | Resource classifiers to use as rules when matching against dialed numbers | `object()` | | `false` | `emergency` | Determines if the resource represents emergency services | `boolean()` | `false` | `false` | `enabled` | Determines if the resource is currently enabled | `boolean()` | `true` | `false` | diff --git a/applications/crossbar/priv/api/swagger.json b/applications/crossbar/priv/api/swagger.json index 1ab95a06afb..1b5428b7378 100644 --- a/applications/crossbar/priv/api/swagger.json +++ b/applications/crossbar/priv/api/swagger.json @@ -27904,39 +27904,6 @@ }, "classifiers": { "description": "Resource classifiers to use as rules when matching against dialed numbers", - "properties": { - "emergency": { - "default": false, - "description": "Determines if the resource represents emergency services", - "type": "boolean" - }, - "enabled": { - "default": true, - "description": "Determines if the resource is currently enabled", - "type": "boolean" - }, - "prefix": { - "description": "A string to prepend to the dialed number or capture group of the matching rule", - "maxLength": 64, - "type": "string" - }, - "regex": { - "description": "regexp to match against dialed number", - "type": "string" - }, - "suffix": { - "description": "A string to append to the dialed number or capture group of the matching rule", - "maxLength": 64, - "type": "string" - }, - "weight_cost": { - "default": 50, - "description": "A value between 0 and 100 that determines the order of resources when multiple can be used", - "maximum": 100, - "minimum": 0, - "type": "integer" - } - }, "type": "object" }, "emergency": { diff --git a/applications/crossbar/priv/couchdb/schemas/resources.json b/applications/crossbar/priv/couchdb/schemas/resources.json index a8cc7a1dfb1..3604522de66 100644 --- a/applications/crossbar/priv/couchdb/schemas/resources.json +++ b/applications/crossbar/priv/couchdb/schemas/resources.json @@ -28,37 +28,42 @@ }, "classifiers": { "description": "Resource classifiers to use as rules when matching against dialed numbers", - "properties": { - "emergency": { - "default": false, - "description": "Determines if the resource represents emergency services", - "type": "boolean" - }, - "enabled": { - "default": true, - "description": "Determines if the resource is currently enabled", - "type": "boolean" - }, - "prefix": { - "description": "A string to prepend to the dialed number or capture group of the matching rule", - "maxLength": 64, - "type": "string" - }, - "regex": { - "description": "regexp to match against dialed number", - "type": "string" - }, - "suffix": { - "description": "A string to append to the dialed number or capture group of the matching rule", - "maxLength": 64, - "type": "string" - }, - "weight_cost": { - "default": 50, - "description": "A value between 0 and 100 that determines the order of resources when multiple can be used", - "maximum": 100, - "minimum": 0, - "type": "integer" + "patternProperties": { + ".+": { + "properties": { + "emergency": { + "default": false, + "description": "Determines if the resource represents emergency services", + "type": "boolean" + }, + "enabled": { + "default": true, + "description": "Determines if the resource is currently enabled", + "type": "boolean" + }, + "prefix": { + "description": "A string to prepend to the dialed number or capture group of the matching rule", + "maxLength": 64, + "type": "string" + }, + "regex": { + "description": "regexp to match against dialed number", + "type": "string" + }, + "suffix": { + "description": "A string to append to the dialed number or capture group of the matching rule", + "maxLength": 64, + "type": "string" + }, + "weight_cost": { + "default": 50, + "description": "A value between 0 and 100 that determines the order of resources when multiple can be used", + "maximum": 100, + "minimum": 0, + "type": "integer" + } + }, + "type": "object" } }, "type": "object" diff --git a/applications/stepswitch/src/stepswitch_resources.erl b/applications/stepswitch/src/stepswitch_resources.erl index f50fc0453fb..c64af7d222a 100644 --- a/applications/stepswitch/src/stepswitch_resources.erl +++ b/applications/stepswitch/src/stepswitch_resources.erl @@ -985,34 +985,36 @@ resources_from_jobjs([JObj|JObjs], Resources) -> end. -spec create_resource(kzd_resources:doc(), resources()) -> resources(). -create_resource(JObj, Resources) -> - case kzd_resources:classifiers(JObj) of - 'undefined' -> [resource_from_jobj(JObj) | Resources]; +create_resource(ResourceJObj, Resources) -> + case kzd_resources:classifiers(ResourceJObj) of + 'undefined' -> [resource_from_jobj(ResourceJObj) | Resources]; ResourceClassifiers -> AvailableClassifiers = kz_json:to_proplist(knm_converters:available_classifiers()), create_resource(kz_json:to_proplist(ResourceClassifiers) ,AvailableClassifiers - ,JObj + ,ResourceJObj ,Resources ) end. -spec create_resource(kz_term:proplist(), kz_term:proplist(), kz_json:object(), resources()) -> resources(). -create_resource([], _ConfigClassifiers, _Resource, Resources) -> Resources; -create_resource([{Classifier, ClassifierJObj}|Classifiers], ConfigClassifiers, Resource, Resources) -> - case props:get_value(Classifier, ConfigClassifiers) of +create_resource([], _ConfigClassifiers, _ResourceJObj, Resources) -> Resources; +create_resource([{ResourceClassifier, ResourceClassifierJObj}|ResourceClassifiers] + ,ConfigClassifiers, ResourceJObj, Resources + ) -> + case props:get_value(ResourceClassifier, ConfigClassifiers) of 'undefined' -> - create_resource(Classifiers, ConfigClassifiers, Resource, Resources); + create_resource(ResourceClassifiers, ConfigClassifiers, ResourceJObj, Resources); ConfigClassifier -> JObj = - create_classifier_resource(Resource - ,ClassifierJObj - ,Classifier + create_classifier_resource(ResourceJObj + ,ResourceClassifierJObj + ,ResourceClassifier ,ConfigClassifier ), - create_resource(Classifiers + create_resource(ResourceClassifiers ,ConfigClassifiers - ,Resource + ,ResourceJObj ,[resource_from_jobj(JObj) | Resources ] diff --git a/core/kazoo_documents/src/kzd_resources.erl b/core/kazoo_documents/src/kzd_resources.erl index 3be85634b9d..fcd2d8e8c22 100644 --- a/core/kazoo_documents/src/kzd_resources.erl +++ b/core/kazoo_documents/src/kzd_resources.erl @@ -12,12 +12,12 @@ -export([caller_id_options_type/1, caller_id_options_type/2, set_caller_id_options_type/2]). -export([cid_rules/1, cid_rules/2, set_cid_rules/2]). -export([classifiers/1, classifiers/2, set_classifiers/2]). --export([classifiers_emergency/1, classifiers_emergency/2, set_classifiers_emergency/2]). --export([classifiers_enabled/1, classifiers_enabled/2, set_classifiers_enabled/2]). --export([classifiers_prefix/1, classifiers_prefix/2, set_classifiers_prefix/2]). --export([classifiers_regex/1, classifiers_regex/2, set_classifiers_regex/2]). --export([classifiers_suffix/1, classifiers_suffix/2, set_classifiers_suffix/2]). --export([classifiers_weight_cost/1, classifiers_weight_cost/2, set_classifiers_weight_cost/2]). +-export([classifier_emergency/2, classifier_emergency/3, set_classifier_emergency/3]). +-export([classifier_enabled/2, classifier_enabled/3, set_classifier_enabled/3]). +-export([classifier_prefix/2, classifier_prefix/3, set_classifier_prefix/3]). +-export([classifier_regex/2, classifier_regex/3, set_classifier_regex/3]). +-export([classifier_suffix/2, classifier_suffix/3, set_classifier_suffix/3]). +-export([classifier_weight_cost/2, classifier_weight_cost/3, set_classifier_weight_cost/3]). -export([emergency/1, emergency/2, set_emergency/2]). -export([enabled/1, enabled/2, set_enabled/2]). -export([flags/1, flags/2, set_flags/2]). @@ -111,77 +111,77 @@ classifiers(Doc, Default) -> set_classifiers(Doc, Classifiers) -> kz_json:set_value([<<"classifiers">>], Classifiers, Doc). --spec classifiers_emergency(doc()) -> boolean(). -classifiers_emergency(Doc) -> - classifiers_emergency(Doc, false). +-spec classifier_emergency(doc(), kz_json:key()) -> boolean(). +classifier_emergency(Doc, ClassifierName) -> + classifier_emergency(Doc, ClassifierName, false). --spec classifiers_emergency(doc(), Default) -> boolean() | Default. -classifiers_emergency(Doc, Default) -> - kz_json:get_boolean_value([<<"classifiers">>, <<"emergency">>], Doc, Default). +-spec classifier_emergency(doc(), kz_json:key(), Default) -> boolean() | Default. +classifier_emergency(Doc, ClassifierName, Default) -> + kz_json:get_boolean_value([<<"classifiers">>, ClassifierName, <<"emergency">>], Doc, Default). --spec set_classifiers_emergency(doc(), boolean()) -> doc(). -set_classifiers_emergency(Doc, ClassifiersEmergency) -> - kz_json:set_value([<<"classifiers">>, <<"emergency">>], ClassifiersEmergency, Doc). +-spec set_classifier_emergency(doc(), kz_json:key(), boolean()) -> doc(). +set_classifier_emergency(Doc, ClassifierName, ClassifiersEmergency) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"emergency">>], ClassifiersEmergency, Doc). --spec classifiers_enabled(doc()) -> boolean(). -classifiers_enabled(Doc) -> - classifiers_enabled(Doc, true). +-spec classifier_enabled(doc(), kz_json:key()) -> boolean(). +classifier_enabled(Doc, ClassifierName) -> + classifier_enabled(Doc, ClassifierName, true). --spec classifiers_enabled(doc(), Default) -> boolean() | Default. -classifiers_enabled(Doc, Default) -> - kz_json:get_boolean_value([<<"classifiers">>, <<"enabled">>], Doc, Default). +-spec classifier_enabled(doc(), kz_json:key(), Default) -> boolean() | Default. +classifier_enabled(Doc, ClassifierName, Default) -> + kz_json:get_boolean_value([<<"classifiers">>, ClassifierName, <<"enabled">>], Doc, Default). --spec set_classifiers_enabled(doc(), boolean()) -> doc(). -set_classifiers_enabled(Doc, ClassifiersEnabled) -> - kz_json:set_value([<<"classifiers">>, <<"enabled">>], ClassifiersEnabled, Doc). +-spec set_classifier_enabled(doc(), kz_json:key(), boolean()) -> doc(). +set_classifier_enabled(Doc, ClassifierName, ClassifiersEnabled) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"enabled">>], ClassifiersEnabled, Doc). --spec classifiers_prefix(doc()) -> kz_term:api_binary(). -classifiers_prefix(Doc) -> - classifiers_prefix(Doc, 'undefined'). +-spec classifier_prefix(doc(), kz_json:key()) -> kz_term:api_binary(). +classifier_prefix(Doc, ClassifierName) -> + classifier_prefix(Doc, ClassifierName, 'undefined'). --spec classifiers_prefix(doc(), Default) -> binary() | Default. -classifiers_prefix(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"prefix">>], Doc, Default). +-spec classifier_prefix(doc(), kz_json:key(), Default) -> binary() | Default. +classifier_prefix(Doc, ClassifierName, Default) -> + kz_json:get_binary_value([<<"classifiers">>, ClassifierName, <<"prefix">>], Doc, Default). --spec set_classifiers_prefix(doc(), binary()) -> doc(). -set_classifiers_prefix(Doc, ClassifiersPrefix) -> - kz_json:set_value([<<"classifiers">>, <<"prefix">>], ClassifiersPrefix, Doc). +-spec set_classifier_prefix(doc(), kz_json:key(), binary()) -> doc(). +set_classifier_prefix(Doc, ClassifierName, ClassifiersPrefix) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"prefix">>], ClassifiersPrefix, Doc). --spec classifiers_regex(doc()) -> kz_term:api_binary(). -classifiers_regex(Doc) -> - classifiers_regex(Doc, 'undefined'). +-spec classifier_regex(doc(), kz_json:key()) -> kz_term:api_binary(). +classifier_regex(Doc, ClassifierName) -> + classifier_regex(Doc, ClassifierName, 'undefined'). --spec classifiers_regex(doc(), Default) -> binary() | Default. -classifiers_regex(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"regex">>], Doc, Default). +-spec classifier_regex(doc(), kz_json:key(), Default) -> binary() | Default. +classifier_regex(Doc, ClassifierName, Default) -> + kz_json:get_binary_value([<<"classifiers">>, ClassifierName, <<"regex">>], Doc, Default). --spec set_classifiers_regex(doc(), binary()) -> doc(). -set_classifiers_regex(Doc, ClassifiersRegex) -> - kz_json:set_value([<<"classifiers">>, <<"regex">>], ClassifiersRegex, Doc). +-spec set_classifier_regex(doc(), kz_json:key(), binary()) -> doc(). +set_classifier_regex(Doc, ClassifierName, ClassifiersRegex) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"regex">>], ClassifiersRegex, Doc). --spec classifiers_suffix(doc()) -> kz_term:api_binary(). -classifiers_suffix(Doc) -> - classifiers_suffix(Doc, 'undefined'). +-spec classifier_suffix(doc(), kz_json:key()) -> kz_term:api_binary(). +classifier_suffix(Doc, ClassifierName) -> + classifier_suffix(Doc, ClassifierName, 'undefined'). --spec classifiers_suffix(doc(), Default) -> binary() | Default. -classifiers_suffix(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"suffix">>], Doc, Default). +-spec classifier_suffix(doc(), kz_json:key(), Default) -> binary() | Default. +classifier_suffix(Doc, ClassifierName, Default) -> + kz_json:get_binary_value([<<"classifiers">>, ClassifierName, <<"suffix">>], Doc, Default). --spec set_classifiers_suffix(doc(), binary()) -> doc(). -set_classifiers_suffix(Doc, ClassifiersSuffix) -> - kz_json:set_value([<<"classifiers">>, <<"suffix">>], ClassifiersSuffix, Doc). +-spec set_classifier_suffix(doc(), kz_json:key(), binary()) -> doc(). +set_classifier_suffix(Doc, ClassifierName, ClassifiersSuffix) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"suffix">>], ClassifiersSuffix, Doc). --spec classifiers_weight_cost(doc()) -> integer(). -classifiers_weight_cost(Doc) -> - classifiers_weight_cost(Doc, 50). +-spec classifier_weight_cost(doc(), kz_json:key()) -> integer(). +classifier_weight_cost(Doc, ClassifierName) -> + classifier_weight_cost(Doc, ClassifierName, 50). --spec classifiers_weight_cost(doc(), Default) -> integer() | Default. -classifiers_weight_cost(Doc, Default) -> - kz_json:get_integer_value([<<"classifiers">>, <<"weight_cost">>], Doc, Default). +-spec classifier_weight_cost(doc(), kz_json:key(), Default) -> integer() | Default. +classifier_weight_cost(Doc, ClassifierName, Default) -> + kz_json:get_integer_value([<<"classifiers">>, ClassifierName, <<"weight_cost">>], Doc, Default). --spec set_classifiers_weight_cost(doc(), integer()) -> doc(). -set_classifiers_weight_cost(Doc, ClassifiersWeightCost) -> - kz_json:set_value([<<"classifiers">>, <<"weight_cost">>], ClassifiersWeightCost, Doc). +-spec set_classifier_weight_cost(doc(), kz_json:key(), integer()) -> doc(). +set_classifier_weight_cost(Doc, ClassifierName, ClassifiersWeightCost) -> + kz_json:set_value([<<"classifiers">>, ClassifierName, <<"weight_cost">>], ClassifiersWeightCost, Doc). -spec emergency(doc()) -> boolean(). emergency(Doc) -> diff --git a/core/kazoo_documents/src/kzd_resources.erl.src b/core/kazoo_documents/src/kzd_resources.erl.src index 5f0dc109ae5..bd439b90e6d 100644 --- a/core/kazoo_documents/src/kzd_resources.erl.src +++ b/core/kazoo_documents/src/kzd_resources.erl.src @@ -10,12 +10,7 @@ -export([caller_id_options_type/1, caller_id_options_type/2, set_caller_id_options_type/2]). -export([cid_rules/1, cid_rules/2, set_cid_rules/2]). -export([classifiers/1, classifiers/2, set_classifiers/2]). --export([classifiers_emergency/1, classifiers_emergency/2, set_classifiers_emergency/2]). --export([classifiers_enabled/1, classifiers_enabled/2, set_classifiers_enabled/2]). --export([classifiers_prefix/1, classifiers_prefix/2, set_classifiers_prefix/2]). --export([classifiers_regex/1, classifiers_regex/2, set_classifiers_regex/2]). --export([classifiers_suffix/1, classifiers_suffix/2, set_classifiers_suffix/2]). --export([classifiers_weight_cost/1, classifiers_weight_cost/2, set_classifiers_weight_cost/2]). +-export([classifier/2, classifier/3, set_classifier/3]). -export([emergency/1, emergency/2, set_emergency/2]). -export([enabled/1, enabled/2, set_enabled/2]). -export([flags/1, flags/2, set_flags/2]). @@ -95,77 +90,17 @@ classifiers(Doc, Default) -> set_classifiers(Doc, Classifiers) -> kz_json:set_value([<<"classifiers">>], Classifiers, Doc). --spec classifiers_emergency(doc()) -> boolean(). -classifiers_emergency(Doc) -> - classifiers_emergency(Doc, false). +-spec classifier(doc(), kz_json:key()) -> kz_term:api_object(). +classifier(Doc, Classifier) -> + classifier(Doc, Classifier, 'undefined'). --spec classifiers_emergency(doc(), Default) -> boolean() | Default. -classifiers_emergency(Doc, Default) -> - kz_json:get_boolean_value([<<"classifiers">>, <<"emergency">>], Doc, Default). +-spec classifier(doc(), kz_json:key(), Default) -> kz_json:object() | Default. +classifier(Doc, Classifier, Default) -> + kz_json:get_json_value([<<"classifiers">>, Classifier], Doc, Default). --spec set_classifiers_emergency(doc(), boolean()) -> doc(). -set_classifiers_emergency(Doc, ClassifiersEmergency) -> - kz_json:set_value([<<"classifiers">>, <<"emergency">>], ClassifiersEmergency, Doc). - --spec classifiers_enabled(doc()) -> boolean(). -classifiers_enabled(Doc) -> - classifiers_enabled(Doc, true). - --spec classifiers_enabled(doc(), Default) -> boolean() | Default. -classifiers_enabled(Doc, Default) -> - kz_json:get_boolean_value([<<"classifiers">>, <<"enabled">>], Doc, Default). - --spec set_classifiers_enabled(doc(), boolean()) -> doc(). -set_classifiers_enabled(Doc, ClassifiersEnabled) -> - kz_json:set_value([<<"classifiers">>, <<"enabled">>], ClassifiersEnabled, Doc). - --spec classifiers_prefix(doc()) -> kz_term:api_binary(). -classifiers_prefix(Doc) -> - classifiers_prefix(Doc, 'undefined'). - --spec classifiers_prefix(doc(), Default) -> binary() | Default. -classifiers_prefix(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"prefix">>], Doc, Default). - --spec set_classifiers_prefix(doc(), binary()) -> doc(). -set_classifiers_prefix(Doc, ClassifiersPrefix) -> - kz_json:set_value([<<"classifiers">>, <<"prefix">>], ClassifiersPrefix, Doc). - --spec classifiers_regex(doc()) -> kz_term:api_binary(). -classifiers_regex(Doc) -> - classifiers_regex(Doc, 'undefined'). - --spec classifiers_regex(doc(), Default) -> binary() | Default. -classifiers_regex(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"regex">>], Doc, Default). - --spec set_classifiers_regex(doc(), binary()) -> doc(). -set_classifiers_regex(Doc, ClassifiersRegex) -> - kz_json:set_value([<<"classifiers">>, <<"regex">>], ClassifiersRegex, Doc). - --spec classifiers_suffix(doc()) -> kz_term:api_binary(). -classifiers_suffix(Doc) -> - classifiers_suffix(Doc, 'undefined'). - --spec classifiers_suffix(doc(), Default) -> binary() | Default. -classifiers_suffix(Doc, Default) -> - kz_json:get_binary_value([<<"classifiers">>, <<"suffix">>], Doc, Default). - --spec set_classifiers_suffix(doc(), binary()) -> doc(). -set_classifiers_suffix(Doc, ClassifiersSuffix) -> - kz_json:set_value([<<"classifiers">>, <<"suffix">>], ClassifiersSuffix, Doc). - --spec classifiers_weight_cost(doc()) -> integer(). -classifiers_weight_cost(Doc) -> - classifiers_weight_cost(Doc, 50). - --spec classifiers_weight_cost(doc(), Default) -> integer() | Default. -classifiers_weight_cost(Doc, Default) -> - kz_json:get_integer_value([<<"classifiers">>, <<"weight_cost">>], Doc, Default). - --spec set_classifiers_weight_cost(doc(), integer()) -> doc(). -set_classifiers_weight_cost(Doc, ClassifiersWeightCost) -> - kz_json:set_value([<<"classifiers">>, <<"weight_cost">>], ClassifiersWeightCost, Doc). +-spec set_classifier(doc(), kz_json:key(), kz_json:object()) -> doc(). +set_classifier(Doc, Classifier, Value) -> + kz_json:set_value([<<"classifiers">>, Classifier], Value, Doc). -spec emergency(doc()) -> boolean(). emergency(Doc) ->