diff --git a/src/GenerateurJson.elm b/src/GenerateurJson.elm new file mode 100644 index 0000000..d6e75e9 --- /dev/null +++ b/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