То, что вы заботитесь о точном форматировании результирующей строки, предполагает, что вы реализуете кодек в 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
, чтобы вы могли видеть точные строки, генерируемые в выводе трассировки сценария.