Синтаксические ошибки в Main.daml - PullRequest
0 голосов
/ 18 февраля 2019

Мой код 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 Ответ

0 голосов
/ 19 февраля 2019

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

...