You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: _cost_category.rs
    path of file: ./repos/aws-sdk-rust/sdk/costexplorer/src/types
    
    the code of the file until where you have to start completion: // Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.

/// <p>The structure of Cost Categories. This includes detailed metadata and the set of rules for the <code>CostCategory</code> object.</p>
#[non_exhaustive]
#[derive(::std::clone::Clone, ::std::cmp::PartialEq, ::std::fmt::Debug)]
pub struct CostCategory {
    /// <p>The unique identifier for your Cost Category.</p>
    pub cost_category_arn: ::std::string::String,
    /// <p>The effective start date of your Cost Category.</p>
    pub effective_start: ::std::string::String,
    /// <p>The effective end date of your Cost Category.</p>
    pub effective_end: ::std::option::Option<::std::string::String>,
    /// <p>The unique name of the Cost Category.</p>
    pub name: ::std::string::String,
    /// <p>The rule schema version in this particular Cost Category.</p>
    pub rule_version: crate::types::CostCategoryRuleVersion,
    /// <p>The rules are processed in order. If there are multiple rules that match the line item, then the first rule to match is used to determine that Cost Category value.</p>
    pub rules: ::std::vec::Vec<crate::types::CostCategoryRule>,
    /// <p>The split charge rules that are used to allocate your charges between your Cost Category values.</p>
    pub split_charge_rules: ::std::option::Option<::std::vec::Vec<crate::types::CostCategorySplitChargeRule>>,
    /// <p>The list of processing statuses for Cost Management products for a specific cost category.</p>
    pub processing_status: ::std::option::Option<::std::vec::Vec<crate::types::CostCategoryProcessingStatus>>,
    /// <p>The default value for the cost category.</p>
    pub default_value: ::std::option::Option<::std::string::String>,
}
impl CostCategory {
    /// 
    
    pub fn build(self) -> ::std::result::Result<crate::types::CostCategory, ::aws_smithy_types::error::operation::BuildError> {
        ::std::result::Result::Ok(crate::types::CostCategory {
            cost_category_arn: self.cost_category_arn.ok_or_else(|| {
                ::aws_smithy_types::error::operation::BuildError::missing_field(
                    "cost_category_arn",
                    "cost_category_arn was not specified but it is required when building CostCategory",
                )
            })?,
            effective_start: self.effective_start.ok_or_else(|| {
                ::aws_smithy_types::error::operation::BuildError::missing_field(
                    "effective_start",
                    "effective_start was not specified but it is required when building CostCategory",
                )
            })?,
            effective_end: self.effective_end,
            name: self.name.ok_or_else(|| {
                ::aws_smithy_types::error::operation::BuildError::missing_field(
                    "name",
                    "name was not specified but it is required when building CostCategory",
                )
            })?,
            rule_version: self.rule_version.ok_or_else(|| {
                ::aws_smithy_types::error::operation::BuildError::missing_field(
                    "rule_version",
                    "rule_version was not specified but it is required when building CostCategory",
                )
            })?,
            rules: self.rules.ok_or_else(|| {
                ::aws_smithy_types::error::operation::BuildError::missing_field(
                    "rules",
                    "rules was not specified but it is required when building CostCategory",
                )
            })?,
            split_charge_rules: self.split_charge_rules,
            processing_status: self.processing_status,
            default_value: self.default_value,
        })
    }