Манипулирующая запись в шаблоне - PullRequest
1 голос
/ 30 марта 2020

Я хотел бы сделать некоторую структуру над кодом и ввести записи в шаблон. С простой версией все работает нормально, хотя с записями не работает. Вы можете посоветовать? Спасибо

- РАБОЧАЯ ВЕРСИЯ -

daml 1.2
module Magic_potion where

template Potion_Taken
  with
    holder : Party
    tube_id : Text
  where
    signatory holder

    controller holder can
      UpdateData : ContractId Potion_Taken
        with
          newTube_id : Text
        do
          create this with
            tube_id = newTube_id

sampling_1 = scenario do
  w <- getParty "Wizard 1"
  potionTaken <- submit w do create Potion_Taken with holder = w; tube_id = "tube 1"
  newPotionTaken <- submit w do exercise potionTaken UpdateData with newTube_id = "tube 2"
  submit w do 
    newP <- fetch newPotionTaken
    assert (newP.tube_id == "tube 2")

- НЕИСПРАВНОСТЬ ВЕРСИИ -

data Content = Content
  with
    tube_id : Text

template Potion_Taken
  with
    holder : Party
    content : Content
  where
    signatory holder

    controller holder can
      UpdateData : ContractId Potion_Taken
        with
          newTube_id : Text
        do
          create this with 
            content.tube_id = newTube_id -- This line seems to be the trouble

sampling_1 = scenario do
  w <- getParty "Wizard 1"
  potionTaken <- submit w do create Potion_Taken with holder = h; content = Content with tube_id = "tube 1"
  newPotionTaken <- submit h do exercise potionTaken UpdateData with newTube_id = "tube 2"
  submit w do 
    newB <- fetch newPotionTaken
    assert (newP.content.tube_id == "tube 2")

1 Ответ

1 голос
/ 30 марта 2020
create this with 
  content.tube_id = newTube_id -- This line seems to be the trouble

Это действительно ваша проблема. Чтобы избежать двусмысленности, предложение with допускает только один уровень именования. Это означает, что если вам нужна новая запись Content в вашей записи Potion_Taken, вам нужно будет ее создать. К счастью, with вложен чисто, поэтому он не слишком громоздкий.

create this with
  content = Content with tube_id = newTube_id

Более того, если Content имеет несколько полей и вы хотите обновить только подмножество, синтаксис конструктора копирования также работает здесь:

create this with
  content = this.content with tube_id = newTube_id
...