Как извлечь название партии? - PullRequest
0 голосов
/ 10 января 2019

Как в контракте DAML извлечь имя участника из поля Стороны?

В настоящее время toText p дает мне Party(Alice). Я бы хотел оставить только название партии.

1 Ответ

0 голосов
/ 11 января 2019

То, что вы заботитесь о точном форматировании результирующей строки, предполагает, что вы реализуете кодек в DAML. Как общий принцип, DAML выделяется как язык моделирования / контракта, но, следовательно, имеет ограниченные возможности для поддержки работы, ориентированной на IO, которая подразумевается в этом вопросе. Как правило, лучше возвращать значения DAML и реализовывать кодеки в Java / Scala / C # / Haskell / etc, взаимодействующие с DAML через API Ledger.

Тем не менее, если у вас есть значение Text, у вас также есть доступ к стандартным List функциям манипуляции с помощью unpack, поэтому преобразование "Party(Alice)" в "Alice" не так уж сложно:

daml 1.0 module PartyExtract where

import Base.List

def pack (cs: List Char) : Text =
  foldl (fun (acc: Text) (c: Char) -> acc <> singleton c) "" cs;

def partyToText (p: Party): Text =
  pack $ reverse $ drop 2 $ reverse $ drop 7 $ unpack $ toText p

test foo : Scenario {} = scenario
  let p = 'Alice'
  assert $ "Alice" == partyToText p

В DAML 1.2 стандартная библиотека была расширена, поэтому приведенный выше код можно упростить:

daml 1.2
module PartyExtract2
where

import DA.Text

traceDebug : (Show a, Show b) => b -> a -> a
traceDebug b a = trace (show b <> show a) $ a

partyToText : Party -> Text
partyToText p = dropPrefix "'" $ dropSuffix "'" $ traceDebug "show party: " $ show p

foo : Scenario ()
foo = do
  p <- getParty "Alice"
  assert $ "Alice" == (traceDebug "partyToText party: " $ partyToText p)

ПРИМЕЧАНИЕ. Я оставил определение и вызовы traceDebug, чтобы вы могли видеть точные строки, генерируемые в выводе трассировки сценария.

...