#ifndef AWS_SDKUTILS_ENDPOINTS_RULESET_H
#define AWS_SDKUTILS_ENDPOINTS_RULESET_H
#include <aws/common/byte_buf.h>
#include <aws/sdkutils/sdkutils.h>
struct aws_endpoints_ruleset;
struct aws_partitions_config;
struct aws_endpoints_parameter;
struct aws_endpoints_rule_engine;
struct aws_endpoints_resolved_endpoint;
struct aws_endpoints_request_context;
struct aws_hash_table;
enum aws_endpoints_parameter_type { AWS_ENDPOINTS_PARAMETER_STRING, AWS_ENDPOINTS_PARAMETER_BOOLEAN };
enum aws_endpoints_resolved_endpoint_type { AWS_ENDPOINTS_RESOLVED_ENDPOINT, AWS_ENDPOINTS_RESOLVED_ERROR };
AWS_EXTERN_C_BEGIN
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_get_supported_ruleset_version(void);
AWS_SDKUTILS_API enum aws_endpoints_parameter_type aws_endpoints_parameter_get_type(
const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_parameter_get_built_in(
const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API int aws_endpoints_parameter_get_default_string(
const struct aws_endpoints_parameter *parameter,
struct aws_byte_cursor *out_cursor);
AWS_SDKUTILS_API int aws_endpoints_parameter_get_default_boolean(
const struct aws_endpoints_parameter *parameter,
const bool **out_bool);
AWS_SDKUTILS_API bool aws_endpoints_parameter_get_is_required(const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_parameter_get_documentation(
const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API bool aws_endpoints_parameters_get_is_deprecated(const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_parameter_get_deprecated_message(
const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_parameter_get_deprecated_since(
const struct aws_endpoints_parameter *parameter);
AWS_SDKUTILS_API struct aws_endpoints_ruleset *aws_endpoints_ruleset_new_from_string(
struct aws_allocator *allocator,
struct aws_byte_cursor ruleset_json);
AWS_SDKUTILS_API struct aws_endpoints_ruleset *aws_endpoints_ruleset_acquire(struct aws_endpoints_ruleset *ruleset);
AWS_SDKUTILS_API struct aws_endpoints_ruleset *aws_endpoints_ruleset_release(struct aws_endpoints_ruleset *ruleset);
AWS_SDKUTILS_API const struct aws_hash_table *aws_endpoints_ruleset_get_parameters(
struct aws_endpoints_ruleset *ruleset);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_ruleset_get_version(const struct aws_endpoints_ruleset *ruleset);
AWS_SDKUTILS_API struct aws_byte_cursor aws_endpoints_ruleset_get_service_id(
const struct aws_endpoints_ruleset *ruleset);
AWS_SDKUTILS_API struct aws_endpoints_rule_engine *aws_endpoints_rule_engine_new(
struct aws_allocator *allocator,
struct aws_endpoints_ruleset *ruleset,
struct aws_partitions_config *partitions_config);
AWS_SDKUTILS_API struct aws_endpoints_rule_engine *aws_endpoints_rule_engine_acquire(
struct aws_endpoints_rule_engine *rule_engine);
AWS_SDKUTILS_API struct aws_endpoints_rule_engine *aws_endpoints_rule_engine_release(
struct aws_endpoints_rule_engine *rule_engine);
AWS_SDKUTILS_API struct aws_endpoints_request_context *aws_endpoints_request_context_new(
struct aws_allocator *allocator);
AWS_SDKUTILS_API struct aws_endpoints_request_context *aws_endpoints_request_context_acquire(
struct aws_endpoints_request_context *request_context);
AWS_SDKUTILS_API struct aws_endpoints_request_context *aws_endpoints_request_context_release(
struct aws_endpoints_request_context *request_context);
AWS_SDKUTILS_API int aws_endpoints_request_context_add_string(
struct aws_allocator *allocator,
struct aws_endpoints_request_context *context,
struct aws_byte_cursor name,
struct aws_byte_cursor value);
AWS_SDKUTILS_API int aws_endpoints_request_context_add_boolean(
struct aws_allocator *allocator,
struct aws_endpoints_request_context *context,
struct aws_byte_cursor name,
bool value);
AWS_SDKUTILS_API int aws_endpoints_rule_engine_resolve(
struct aws_endpoints_rule_engine *engine,
const struct aws_endpoints_request_context *context,
struct aws_endpoints_resolved_endpoint **out_resolved_endpoint);
AWS_SDKUTILS_API struct aws_endpoints_resolved_endpoint *aws_endpoints_resolved_endpoint_acquire(
struct aws_endpoints_resolved_endpoint *resolved_endpoint);
AWS_SDKUTILS_API struct aws_endpoints_resolved_endpoint *aws_endpoints_resolved_endpoint_release(
struct aws_endpoints_resolved_endpoint *resolved_endpoint);
AWS_SDKUTILS_API enum aws_endpoints_resolved_endpoint_type aws_endpoints_resolved_endpoint_get_type(
const struct aws_endpoints_resolved_endpoint *resolved_endpoint);
AWS_SDKUTILS_API int aws_endpoints_resolved_endpoint_get_url(
const struct aws_endpoints_resolved_endpoint *resolved_endpoint,
struct aws_byte_cursor *out_url);
AWS_SDKUTILS_API int aws_endpoints_resolved_endpoint_get_properties(
const struct aws_endpoints_resolved_endpoint *resolved_endpoint,
struct aws_byte_cursor *out_properties);
AWS_SDKUTILS_API int aws_endpoints_resolved_endpoint_get_headers(
const struct aws_endpoints_resolved_endpoint *resolved_endpoint,
const struct aws_hash_table **out_headers);
AWS_SDKUTILS_API int aws_endpoints_resolved_endpoint_get_error(
const struct aws_endpoints_resolved_endpoint *resolved_endpoint,
struct aws_byte_cursor *out_error);
AWS_EXTERN_C_END
#endif