Skip to content
Discussions/App Development/Placement of `do` in choicesForum ↗

Placement of `do` in choices

App Development5 posts356 views6 likesLast activity Dec 2020
LU
LucianoOP
Dec 2020

I find it very confusing that for choices the placement of the do token is handled differently for controller first vs choice first syntax.

With controller first, you can leave the do block at the end of the statement, like so:

    controller counterparty can
      Sell : ContractId FinancialContract with obligations: Obligations do
        ...

But with choice first, this doesn’t compile:

    choice EnterInto : ContractId MasterAgreement with requestor : Party
      controller requestor do 
        create MasterAgreement with bearer = requestor, counterparty

But moving the do one line down does:

    choice EnterInto : ContractId MasterAgreement with requestor : Party
      controller requestor
        do create MasterAgreement with bearer = requestor, counterparty

Is this intentional? Why this difference?

NI
Nick_Chapman
Dec 2020

Yes, this is somewhat unfortunate.

The difference stems from the fact that the older controller-first syntax includes the can keyword, which allows the parser to know when the list of controller-parties is finished – because in general there can be multiple controller parties:

controller counterparty1, counterparty2 can
  Sell : ContractId FinancialContract with obligations: Obligations do
     ...

The layout rules of DAML then insert implicit braces to make the party-list explicit. These braces can be provided explicitly if you like, making the following parse valid:

controller { counterparty1, counterparty2 } can
  Sell : ContractId FinancialContract with obligations: Obligations do
     ...

However, in the newer choice-first syntax, there is no can keyword to mark the end of the controller-parties. So the end of the party list (even a singleton list) must be marked either with a line break (allowing layout to do it’s stuff):

choice EnterInto : ContractId MasterAgreement with requestor : Party
  controller requestor
    do create MasterAgreement with bearer = requestor, counterparty

Or, again, explicit braces may be inserted. Which allows the entire controller declaration on a single line:

choice EnterInto : ContractId MasterAgreement with requestor : Party
  controller { requestor } do create MasterAgreement with bearer = requestor, counterparty

Or, split after the do, if you prefer:

choice EnterInto : ContractId MasterAgreement with requestor : Party
  controller { requestor } do
    create MasterAgreement with bearer = requestor, counterparty
LU
Luciano
Dec 2020

would this also be solved by allowing a can in the choice-first syntax?

NI
Nick_Chapman
Dec 2020

It’s possible having a keyword at this point would also get you the layout you want, without explicit braces. However there are problems with using can because it has the wrong layout behaviour as a consequence of the old controller-first syntax.

In the old syntax, can is is followed by a list of Choice declarations, in braces, explicit or implicit. In the new syntax, can would be followed by the choice-body expression, which does not have braces.

LE
Levente_Barczy
Dec 2020

Hi, for that very reason, I put the do on the next line in a choice choice. Also note the double indented with:

choice MyChoiceName: ContractId SomeTemplate
    with
      arg1: Foo
      party: Party 
  controller party 
    do 
      theThings...

Note that this way, the do blocks line up exactly between the two choices syntaxes.

Luciano:
choice EnterInto : ContractId MasterAgreement with requestor : Party
      controller requestor do 
        create MasterAgreement with bearer = requestor, counterparty
← Back to Discussions