Синтаксические ошибки в Main.daml

Мой код Main.daml выглядит следующим образом:

daml 1.2
module Main where

type CarId = ContractId Car -- for return type on controller actions

template Car
  with
    dealer : Party
    insurer : Party
    vin: Text
    date_vehicle_added: Date
    daily_insurance_rate: Decimal
    daily_rate_APD: Decimal
    covered: Bool --initialize to false and set to true when added
    observers : [Party]
  where
    signatory dealer

    agreement
      toText dealer <> " agrees to pay " <> toText insurer <> " at daily rate of " 

    controller dealer can
      Add_Car : CarId
        with
           startCoverage: Date
        do
        -- Return this car with the start date provided by the dealer
        create this with date_vehicle_added = startCoverage, covered = True


      Remove_Car 
        do
          archive this

setup = scenario do
  dealer1 <- getParty "Clevland_Heights"
  insurance1 <- getParty "Ins"

  car1AddCid <- submit dealer1 do
    carCid <- create Car with
      dealer = dealer1
      insurer = insurance1
      vin = "1A"
      daily_insurance_rate = 1.5 
      daily_rate_APD = 0.16
      covered = False 
      observers = [insurance1]
      date_vehicle_added = "date 1970 Jan 1"  -- must be initialized

    exercise carCid Add_Car with startCoverage = "date 2019 Apr 5"

  submit dealer1 do
    exercise car1AddCid Remove_Car

Я вижу две ошибки в окне "ПРОБЛЕМЫ"

1. error: parse error on input 'do' (43,9).  

Это строка сразу после выбора "Remove_Car".

2. error: Data contructor not in scope:Remove_Car

Это последняя строчка программы.

Я попытался сформировать синтаксис и интервал в моем коде после Main.daml и Ion.daml приложения быстрого запуска. Что вызывает эти ошибки?

1 ответ

Ваш Remove_Car У выбора есть пара вопросов.

  1. Отсутствует тип возврата. Поскольку он ничего не возвращает, тип возвращаемого значения Unitнаписано (): Return_Car : (),
  2. this это не договор, а основная часть договора, по которому осуществляется выбор. Поскольку это не контракт, его нельзя архивировать. На самом деле есть еще одно ключевое слово self, который ссылается на текущий контракт, но его использование тоже не сработает. Вы бы заархивировали контракт в рамках потребляющего выбора, таким образом, потребляя контракт дважды - такого рода DAML двойных расходов перестает происходить.

Чтобы исправить 2., у вас есть три варианта:

  1. Удалите это вообще. Каждый контракт имеет встроенный Archive выбор, который разрешен всеми подписавшими. Как контроллер вашего Remove_Car выбор такой же, как у подписавшего договора, он просто дублирует Archive,
  2. Просто используйте потребительский характер потребительского выбора:
    Remove_Car : ()
      do return ()
    
  3. Использовать nonconsuming выбор и self ключевое слово:
    nonconsuming Remove_Car : ()
      do archive self
    

Стилистически я бы выбрал вариант 1, когда это возможно, и вариант 2, если мне нужно дать подмножеству подписантов способ архивирования контракта. С использованием self Ключевое слово трудно рассуждать, поэтому его лучше избегать, если в этом нет необходимости.

Другие вопросы по тегам