Création d'une page Générateur Json

pull/1/head
Jean-Christophe Jameux 3 years ago
parent c3c1514160
commit b657985cb4
  1. 246
      src/GenerateurJson.elm

@ -0,0 +1,246 @@
module GenerateurJson exposing (..)
import Browser exposing (Document)
import Element exposing (..)
import Element.Background as Background
import Element.Border as Border
import Element.Events exposing (..)
import Element.Font as Font
import Element.Input as Input
import ElmCodeGenerator
import File.Download
import Html exposing (Attribute, Html, button, div, iframe, input, p, section, textarea)
import Json.Decode
import Json.Encode
import List as L
import Set
import String as S
import Style exposing (..)
titre =
"Générateur Json"
{-
-}
type alias Model =
{ nomObjet : String
, sourceJson : String
, codeElmGenere : String
}
init : Model
init =
{ nomObjet = ""
, sourceJson = ""
, codeElmGenere = ""
}
{-
-}
type Msg
= NomObjet String
| SourceJson String
| GenererCodeElm
| TelechargerCodeElm
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NomObjet nom ->
( { model
| nomObjet = nom
, codeElmGenere = generateur model.nomObjet model.sourceJson
}
, Cmd.none
)
SourceJson source ->
( { model
| sourceJson = source
, codeElmGenere = generateur model.nomObjet model.sourceJson
}
, Cmd.none
)
GenererCodeElm ->
( { model | codeElmGenere = generateur model.nomObjet model.sourceJson }
, Cmd.none
)
TelechargerCodeElm ->
( model
, File.Download.string (model.nomObjet ++ ".elm") "text/elm" model.codeElmGenere
)
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
{-
-}
view : Model -> Element Msg
view model =
row
[ spacing grandEspacement
, padding tresGrandEspacement
, height fill
, width fill
, scrollbars
]
[ column [ spacing petitEspacement, height fill, width fill, scrollbars ]
[ Input.multiline
[ height fill
, width fill
, clip
, scrollbars
, Background.color <| couleurUI <| couleurArrierePlan
, Border.rounded 8
, Border.innerShadow
{ blur = 10
, color = rgb255 10 10 10
, offset = ( 0.3, 0.4 )
, size = 2
}
]
{ onChange = NomObjet
, label = Input.labelHidden "truc"
, placeholder =
Just <|
Input.placeholder [] <|
text "NomDeLobjet"
, text = model.nomObjet
, spellcheck = False
}
, Input.multiline
[ height fill
, width fill
, clip
, scrollbars
, Background.color <| couleurUI <| couleurArrierePlan
, Border.rounded 8
, Border.innerShadow
{ blur = 10
, color = rgb255 10 10 10
, offset = ( 0.3, 0.4 )
, size = 2
}
]
{ onChange = SourceJson
, label = Input.labelHidden "chose"
, placeholder =
Just <|
Input.placeholder [] <|
text "Code source Json à intégrer dans un projet Elm"
, text = model.sourceJson
, spellcheck = False
}
]
, column [ spacing petitEspacement, height fill, width fill, scrollbars ]
-- L'attibut scrollbars présent dans la liste ci-dessus ^^^^^^^^^^
-- est nécessaire pour que l'élément ci-dessous ne s'étende pas !
[ row
[ width fill
, padding petitEspacement
, spacing tresGrandEspacement
]
[ bouton GenererCodeElm "Générer le code source Elm"
, bouton TelechargerCodeElm "Télécharger"
]
, el
--^^ Cet élément ci
[ height fill
, width fill
, clip
, scrollbars
--^^^^^^^^^^ Cet attribut ne suffit pas
, padding petitEspacement
, Background.color <| couleurUI <| couleurArrierePlan
, Border.rounded 8
, Border.innerShadow
{ blur = 10
, color = rgb255 10 10 10
, offset = ( 0.3, 0.4 )
, size = 2
}
]
<|
text model.codeElmGenere
]
]
{-
-}
generateur nomObjet sourceJson =
case parser nomObjet sourceJson of
Ok code ->
S.join "\n" <|
code.imports
++ code.types
++ code.decoders
++ code.encoders
Err erreurs ->
erreurs
parser nomObjet sourceJson =
ElmCodeGenerator.fromJsonSample
{ rootTypeName = nomObjet
, decodeImport =
{ importAlias = "Json.Decode"
, exposingSpec = ElmCodeGenerator.ExposingNone
}
, encodeImport =
{ importAlias = "Json.Encode"
, exposingSpec = ElmCodeGenerator.ExposingNone
}
, decoderStyle = ElmCodeGenerator.PlainDecoders
, namingStyle = ElmCodeGenerator.NounNaming
}
sourceJson
Loading…
Cancel
Save