elm-syntax-dslでコード生成
elm-designerを眺めていたらthe-sett/elm-syntax-dsl
をコード生成に使っているなぁってなって興味を持ちました
the-sett/elm-syntax-dsl
はstil4m/elm-syntax
をシンプルに使いやすくしたよ!って感じらしいです(elm-syntaxの方を使ったことが無いので比較できませんが...)
結構ボリュームがあり、使っている中でこんがらがってきたのでスクラップに少しずつまとめていきます
Comment
は多分生成させないと思うので省きます
基本はfile
を作ってpretty
することでString
になるみたいです
- pretty
- file
Elm.Pretty
にはprepareLayout
というものもありthe-sett/elm-pretty-printer
と連携させることもできるみたいです
File
File
はfile
で生成できます
file :
Module
-> List Import
-> List Declaration
-> Maybe (Comment FileComment)
-> File
こんな感じでモジュール、モジュールの読み込み(複数可)、実際のコード(複数可)、コメントがそれぞれ引数になってる感じです
file
で最小なのはこんな感じだと思います
file (normalModule [] []) [] [] Nothing
Module
Module
を生成する関数はnormalModule
とportModule
です
normalModule : ModuleName -> List TopLevelExpose -> Module
portModule : ModuleName -> List TopLevelExpose -> Module
こんな感じでportが付くかつかないかです
List TopLevelExpose
は空([]
)にすることで(..)が出力されます
ModuleName
ModuleName
はList String
のaliasになってます
type alias ModuleName =
List String
ModuleNameはピリオドで連結してくれます
normalModule ["Element", "Generate", "Colors"] []
小文字も入ってしまうので別途バリデーションが必要かもしれません
normalModule ["element", "generate", "colors"] []
TopLevelExpose
TopLevelExpose
を生成する関数はclosedTypeExpose
, funExpose
, openTypeExpose
, typeOrAliasExpose
の4つです
closedTypeExpose
カスタム型にはopenTypeExposeが使えます
Import
Import
はimportStmt
で生成できます
importStmt : ModuleName -> Maybe ModuleName -> Maybe Exposing -> Import
Declaration
Elmガイドの例を使って書いていこうと思います
型エイリアス
型エイリアスにはaliasDecl
が使えます
type alias User =
{ name : String
, age : Int
}
はこんな感じでできます
aliasDecl Nothing "User" [] <|
recordAnn
[ ( "name", stringAnn )
, ( "age", intAnn )
]