Синтаксические ошибки в 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).  

Это строка сразу после выбора «Удалить_автомобиль».

2. error: Data contructor not in scope:Remove_Car

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

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


person Meyer Auslander    schedule 18.02.2019    source источник


Ответы (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 трудно обосновать, поэтому его лучше избегать, если в этом нет крайней необходимости.

person bame    schedule 18.02.2019