Синтаксические ошибки в 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
У выбора есть пара вопросов.
- Отсутствует тип возврата. Поскольку он ничего не возвращает, тип возвращаемого значения
Unit
написано()
:Return_Car : ()
, this
это не договор, а основная часть договора, по которому осуществляется выбор. Поскольку это не контракт, его нельзя архивировать. На самом деле есть еще одно ключевое словоself
, который ссылается на текущий контракт, но его использование тоже не сработает. Вы бы заархивировали контракт в рамках потребляющего выбора, таким образом, потребляя контракт дважды - такого рода DAML двойных расходов перестает происходить.
Чтобы исправить 2., у вас есть три варианта:
- Удалите это вообще. Каждый контракт имеет встроенный
Archive
выбор, который разрешен всеми подписавшими. Как контроллер вашегоRemove_Car
выбор такой же, как у подписавшего договора, он просто дублируетArchive
, - Просто используйте потребительский характер потребительского выбора:
Remove_Car : () do return ()
- Использовать
nonconsuming
выбор иself
ключевое слово:nonconsuming Remove_Car : () do archive self
Стилистически я бы выбрал вариант 1, когда это возможно, и вариант 2, если мне нужно дать подмножеству подписантов способ архивирования контракта. С использованием self
Ключевое слово трудно рассуждать, поэтому его лучше избегать, если в этом нет необходимости.