/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ Ċ package Ġsoftware . amazon . smithy . rust . codegen . smithy . generators . config Ċ Ċ import Ġsoftware . amazon . smithy . model . Model Ċ import Ġsoftware . amazon . smithy . model . knowledge . Operation Index Ċ import Ġsoftware . amazon . smithy . model . shapes . Service Shape Ċ import Ġsoftware . amazon . smithy . model . traits . Ide mpot ency Token Trait Ċ import Ġsoftware . amazon . smithy . rust . codegen . rust lang . Rust Writer Ċ import Ġsoftware . amazon . smithy . rust . codegen . rust lang . raw Ċ import Ġsoftware . amazon . smithy . rust . codegen . rust lang . rust Block Ċ import Ġsoftware . amazon . smithy . rust . codegen . rust lang . rust Template Ċ import Ġsoftware . amazon . smithy . rust . codegen . smithy . customize . Named Section Generator Ċ import Ġsoftware . amazon . smithy . rust . codegen . smithy . customize . Section Ċ import Ġsoftware . amazon . smithy . rust . codegen . smithy . generators . Protocol Config Ċ import Ġsoftware . amazon . smithy . rust . codegen . util . has Trait Ċ Ċ /** Ċ Ġ* Ġ[ Service Config ] Ġis Ġthe Ġparent Ġtype Ġof Ġsections Ġthat Ġcan Ġbe Ġoverridden Ġwhen Ġgenerating Ġa Ġconfig Ġfor Ġa Ġservice . Ċ Ġ* Ċ Ġ* ĠThis Ġfunctions Ġsimilar Ġto Ġa Ġstrongly Ġtyped Ġversion Ġof Ġ` Code Writer `' s Ġnamed Ġsections Ċ Ġ* Ġ( and Ġmay Ġeventually Ġbe Ġmodified Ġto Ġuse Ġthat Ġfor Ġimplementation ), Ġhowever , Ġit 's Ġcurrently Ġstrictly Ġadd itive . Ċ Ġ* Ċ Ġ* ĠAs Ġthis Ġbecomes Ġused Ġfor Ġmore Ġcomplex Ġcustom izations , Ġthe Ġability Ġto Ġfully Ġreplace Ġthe Ġcontents Ġwill Ġbecome Ċ Ġ* Ġnecessary . Ċ Ġ* Ċ Ġ* ĠUsage : Ċ Ġ* Ġ``` kotlin Ċ Ġ* Ġclass ĠAdd Region Ġ: ĠNamed Section Generator < Service Config >() Ġ{ Ċ Ġ* Ġ Ġoverride Ġfun Ġsection ( section : ĠService Config ): ĠWrit able Ġ{ Ċ Ġ* ĠĠĠ Ġreturn Ġwhen Ġ( section ) Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġis ĠService Config . Config Struct Ġ-> Ġwrite able Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġrust (" pub Ġ( crate ) Ġregion : ĠString , ") Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠ Ġelse Ġ-> Ġempty Section Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ sealed Ġclass ĠService Config ( name : ĠString ) Ġ: ĠSection ( name ) Ġ{ ĊĠĠĠ Ġ/** ĠStruct Ġdefinition Ġof Ġ` Config `. ĠFields Ġshould Ġend Ġwith Ġ`, ` ĊĠĠĠĠ Ġ* Ġ Ġeg . Ġ` foo : ĠBox < u 6 4 >, ` ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġobject ĠConfig Struct Ġ: ĠService Config (" Config Struct ") ĊĠĠĠ Ġ/** Ġimpl Ġblock Ġof Ġ` Config `. Ġ( eg . Ġto Ġadd Ġfunctions ) ĊĠĠĠĠ Ġ* Ġeg . ĊĠĠĠĠ Ġ* Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġrust (" pub Ġfn Ġis _ cross _ region () Ġ-> Ġbool Ġ{ Ġtrue Ġ} ") ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠConfig Impl Ġ: ĠService Config (" Config Impl ") ĊĊĠĠĠ Ġ/** ĠStruct Ġdefinition Ġof Ġ` Config Builder ` Ġ**/ ĊĠĠĠ Ġobject ĠBuilder Struct Ġ: ĠService Config (" Builder Struct ") ĊĠĠĠ Ġ/** Ġimpl Ġblock Ġof Ġ` Config Builder ` Ġ**/ ĊĠĠĠ Ġobject ĠBuilder Impl Ġ: ĠService Config (" Builder Impl ") ĊĠĠĠ Ġ/** ĠConvert Ġfrom Ġa Ġfield Ġin Ġthe Ġbuilder Ġto Ġthe Ġfinal Ġfield Ġin Ġconfig ĊĠĠĠĠ Ġ* Ġ Ġeg . ĊĠĠĠĠ Ġ* Ġ Ġ``` kotlin ĊĠĠĠĠ Ġ* Ġ Ġrust (""" my _ field : Ġmy _ field . unwrap _ or _ else (|| " default ") """) ĊĠĠĠĠ Ġ* Ġ Ġ``` ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġobject ĠBuilder Build Ġ: ĠService Config (" Builder Build ") Ċ } Ċ Ċ // ĠTODO : Ġif Ġthis Ġbecomes Ġhot , Ġit Ġmay Ġneed Ġto Ġbe Ġcached Ġin Ġa Ġknowledge Ġindex Ċ fun ĠService Shape . needs Ide mpot ency Token ( model : ĠModel ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġoperation Index Ġ= ĠOperation Index . of ( model ) ĊĠĠĠ Ġreturn Ġthis . all Operations . flatMap Ġ{ Ġoperation Index . getInput Members ( it ). values Ġ}. any Ġ{ Ġit . has Trait < Ide mpot ency Token Trait >() Ġ} Ċ } Ċ Ċ type alias ĠConfig Custom ization Ġ= ĠNamed Section Generator < Service Config > Ċ Ċ /** Ċ Ġ* ĠGenerate Ġa Ġ` Config ` Ġstruct , Ġimplementation Ġ& Ġbuilder Ġfor Ġa Ġgiven Ġservice , Ġapproximately : Ċ Ġ* Ġ``` rust Ċ Ġ* Ġstruct ĠConfig Ġ{ Ċ Ġ* ĠĠĠ Ġ// Ġvarious Ġmembers Ċ Ġ* Ġ} Ċ Ġ* Ġimpl ĠConfig Ġ{ Ċ Ġ* ĠĠĠ Ġ// Ġsome Ġpublic Ġfunctions Ċ Ġ* Ġ} Ċ Ġ* Ċ Ġ* Ġstruct ĠConfig Builder Ġ{ Ċ Ġ* ĠĠĠ Ġ// Ġgenerally , Ġoptional Ġmembers Ġcorresponding Ġto Ġmembers Ġof Ġ` Config ` Ċ Ġ* Ġ} Ċ Ġ* Ġimpl ĠConfig Builder Ġ{ Ċ Ġ* ĠĠĠ Ġ// Ġbuilder Ġimplementation Ċ Ġ* Ġ} Ċ Ġ*/ Ċ class ĠService Config Generator ( private Ġval Ġcustom izations : ĠList < Config Custom ization > Ġ= ĠlistOf ()) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġwith Base Behavior ( protocol Config : ĠProtocol Config , Ġextra Custom izations : ĠList < Config Custom ization >): ĠService Config Generator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Features Ġ= Ġmutable ListOf < Config Custom ization >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( protocol Config . service Shape . needs Ide mpot ency Token ( protocol Config . model )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Features . add ( Ide mpot ency Token Provider Custom ization ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠService Config Generator ( base Features Ġ+ Ġextra Custom izations ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender ( writer : ĠRust Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . rust Block (" pub Ġstruct ĠConfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . section ( Service Config . Config Struct )( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCustom Ġimplementation Ġfor ĠDebug Ġso Ġwe Ġdon 't Ġneed Ġto Ġenforce ĠDebug Ġdown Ġthe Ġchain ĊĠĠĠĠĠĠĠ Ġwriter . rust Block (" impl Ġstd :: fmt :: Debug Ġfor ĠConfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Template ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn Ġfmt (& self , Ġf : Ġ& mut Ġstd :: fmt :: Formatter <'_>) Ġ-> Ġstd :: fmt :: Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlet Ġmut Ġconfig Ġ= Ġf . debug _ struct (" Config "); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwriter . rust Block (" impl ĠConfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Template ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpub Ġfn Ġbuilder () Ġ-> ĠBuilder Ġ{ ĠBuilder :: default () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . section ( Service Config . Config Impl )( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwriter . raw ("# [ derive ( Default )] ") ĊĠĠĠĠĠĠĠ Ġwriter . rust Block (" pub Ġstruct ĠBuilder ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . section ( Service Config . Builder Struct )( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwriter . rust Block (" impl ĠBuilder ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Template (" pub Ġfn Ġnew () Ġ-> ĠSelf Ġ{ ĠSelf :: default () Ġ} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . section ( Service Config . Builder Impl )( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrust Block (" pub Ġfn Ġbuild ( self ) Ġ-> ĠConfig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrust Block (" Config ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom izations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . section ( Service Config . Builder Build )( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ