Advertisement
Guest User

Untitled

a guest
May 24th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. module Main exposing (main)
  2.  
  3. import Browser exposing (sandbox)
  4. import Debug exposing (toString, todo)
  5. import Dict
  6. import Html exposing (Html, div, text)
  7. import Xml.Decode exposing (..)
  8.  
  9.  
  10. type alias Name =
  11. String
  12.  
  13.  
  14. type Value
  15. = IntValue Int
  16. | StringValue String
  17.  
  18.  
  19. type alias Member =
  20. ( Name, Value )
  21.  
  22.  
  23. type alias Struct =
  24. { foo : String, bar : Int }
  25.  
  26.  
  27. xml : String
  28. xml =
  29. String.join "\n"
  30. [ "<struct>"
  31. , " <member>"
  32. , " <name>hoge</name>"
  33. , " <value>"
  34. , " <string>hello</string>"
  35. , " </value>"
  36. , " </member>"
  37. , " <member>"
  38. , " <name>fuga</name>"
  39. , " <value><i4>100</i4></value>"
  40. , " </member>"
  41. , "</struct>"
  42. ]
  43.  
  44.  
  45. memberNameDecoder : Decoder String
  46. memberNameDecoder =
  47. path [ "name" ] (single string)
  48.  
  49.  
  50. hogeDecoder : Decoder String
  51. hogeDecoder =
  52. with memberNameDecoder <|
  53. \name ->
  54. if name == "hoge" then
  55. path [ "value", "string" ] (single string)
  56.  
  57. else
  58. fail "recode name does not hoge"
  59.  
  60.  
  61. fugaDecoder : Decoder Int
  62. fugaDecoder =
  63. with memberNameDecoder <|
  64. \name ->
  65. if name == "fuga" then
  66. path [ "value", "i4" ] (single int)
  67.  
  68. else
  69. fail "recode name does not fuga"
  70.  
  71.  
  72. structDecoder : Decoder Struct
  73. structDecoder =
  74. let
  75. parseOnMember : Decoder a -> Decoder a
  76. parseOnMember d =
  77. path [ "member" ] (leakyList d)
  78. |> andThen
  79. (\l ->
  80. case List.head l of
  81. Just v ->
  82. succeed v
  83.  
  84. Nothing ->
  85. fail ":("
  86. )
  87. in
  88. succeed (\foo bar -> { foo = foo, bar = bar })
  89. |> andMap (parseOnMember hogeDecoder)
  90. |> andMap (parseOnMember fugaDecoder)
  91.  
  92.  
  93. type alias Model =
  94. String
  95.  
  96.  
  97. init : Model
  98. init =
  99. xml
  100.  
  101.  
  102. view : Model -> Html msg
  103. view model =
  104. let
  105. parsed : String
  106. parsed =
  107. toString <| run structDecoder model
  108. in
  109. div []
  110. [ div [] [ text parsed ]
  111. ]
  112.  
  113.  
  114. main =
  115. sandbox
  116. { init = init
  117. , update = always identity
  118. , view = view
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement