{{#if isOptional}}
  {{container}}.Emplace();
  {{>commandValue ns=ns container=(concat container ".Value()") definedValue=definedValue type=type isOptional=false depth=(incrementDepth depth)}}
{{else if isNullable}}
  {{#if (isLiteralNull definedValue)}}
    {{container}}.SetNull();
  {{else}}
    {{container}}.SetNonNull();
    {{>commandValue ns=ns container=(concat container ".Value()") definedValue=definedValue type=type isNullable=false depth=(incrementDepth depth)}}
  {{/if}}
{{else if isArray}}

  {{ensureIsArray definedValue~}}
  {{! forceNotList=true because we really want the type of a single item here.
      Similarly, forceNotOptional=true and forceNotNullable=true because we
      have accounted for those already. }}
  {{#if definedValue.length}}
  {
    auto * listHolder_{{depth}} = new ListHolder<{{zapTypeToEncodableClusterObjectType type ns=ns forceNotList=true forceNotNullable=true forceNotOptional=true}}>({{definedValue.length}});
    listFreer.add(listHolder_{{depth}});
    {{#each definedValue}}
    {{>commandValue ns=../ns container=(concat "listHolder_" ../depth "->mList[" @index "]") definedValue=. type=../type depth=(incrementDepth ../depth) parent=../parent}}
    {{/each}}
    {{container}} = chip::app::DataModel::List<{{zapTypeToEncodableClusterObjectType type ns=ns forceNotList=true forceNotNullable=true forceNotOptional=true}}>(listHolder_{{depth}}->mList, {{definedValue.length}});
  }
  {{else}}
  {{container}} = chip::app::DataModel::List<{{zapTypeToEncodableClusterObjectType type ns=ns forceNotList=true forceNotNullable=true forceNotOptional=true}}>();
  {{/if}}
{{else}}
  {{#if_is_struct type}}

    {{#zcl_struct_items_by_struct_name type}}
      {{#if_include_struct_item_value ../definedValue name}}
        {{>commandValue ns=parent.ns container=(concat parent.container "." (asLowerCamelCase label)) definedValue=(lookup ../definedValue name) depth=(incrementDepth ../depth)}}
      {{/if_include_struct_item_value}}
    {{/zcl_struct_items_by_struct_name}}

  {{else}}
    {{container}} =
    {{~#if (chip_tests_variables_has definedValue)~}}
      {{definedValue}};
    {{else if (chip_tests_config_has definedValue)}}
      m{{asUpperCamelCase definedValue}}.HasValue() ? m{{asUpperCamelCase definedValue}}.Value() :
      {{~#if_is_strongly_typed_chip_enum type~}}
        static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{chip_tests_config_get_default_value definedValue}});
      {{else if (isCharString type)}}
        chip::Span<const char>("{{chip_tests_config_get_default_value definedValue}}", {{utf8StringLength (chip_tests_config_get_default_value definedValue)}});
      {{else if (isOctetString type)}}
        {{!-- TODO Extract the length of the default value for ByteSpan--}}
      {{else}}
        {{#if_is_strongly_typed_bitmap type}}
          static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{asTypedLiteral (chip_tests_config_get_default_value definedValue) type}});
        {{else}}
          {{asTypedExpression (chip_tests_config_get_default_value definedValue) type}};
        {{/if_is_strongly_typed_bitmap}}
      {{/if_is_strongly_typed_chip_enum~}}
    {{else~}}
      {{~#if_is_strongly_typed_chip_enum type~}}
        static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{definedValue}});
      {{else if (isCharString type)}}
        chip::Span<const char>("{{definedValue}}garbage: not in length on purpose", {{utf8StringLength definedValue}});
      {{else if (isOctetString type)}}
        {{~#if (isHexString definedValue)}}
          chip::ByteSpan(chip::Uint8::from_const_char("{{octetStringFromHexString definedValue}}garbage: not in length on purpose"), {{octetStringLengthFromHexString definedValue}});
        {{else}}
          chip::ByteSpan(chip::Uint8::from_const_char("{{octetStringEscapedForCLiteral definedValue}}garbage: not in length on purpose"), {{definedValue.length}});
        {{/if}}
      {{else}}
        {{#if_is_strongly_typed_bitmap type}}
          static_cast<{{zapTypeToEncodableClusterObjectType type ns=ns}}>({{asTypedLiteral definedValue type}});
        {{else}}
          {{asTypedExpression definedValue type}};
        {{/if_is_strongly_typed_bitmap}}
      {{/if_is_strongly_typed_chip_enum~}}
    {{~/if~}}
    
  {{/if_is_struct}}
{{/if}}
