在DAML合同中,如何从“派对”字段中提取派对名称?
当前,toText p
给了我Party(Alice)
。我只想保留聚会的名字。
答案 0 :(得分:3)
如果您关心结果字符串的精确格式,则表明您正在DAML中实现编解码器。作为一般原则,DAML擅长于使用建模/合同语言,但其功能有限,无法支持该问题所暗示的面向IO的工作。通常,最好返回DAML值,并在Java / Scala / C#/ Haskell / etc中通过Ledger API与DAML接口实现编解码器。
不过,一旦有了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
,因此您可以在方案跟踪输出中看到正在生成的确切字符串。