mirror of
https://github.com/dillonkearns/elm-pages-v3-beta.git
synced 2024-11-23 22:26:16 +03:00
Fix issue with inifinite loop, now give proper error message for frontmatter decoding errors.
This commit is contained in:
parent
b24366673c
commit
473557681a
@ -65,7 +65,7 @@ frontmatter frontmatterDecoder =
|
|||||||
|
|
||||||
import BackendTask exposing (BackendTask)
|
import BackendTask exposing (BackendTask)
|
||||||
import BackendTask.File as File
|
import BackendTask.File as File
|
||||||
import Decode as Decode exposing (Decoder)
|
import Decode exposing (Decoder)
|
||||||
|
|
||||||
blogPost : BackendTask BlogPostMetadata
|
blogPost : BackendTask BlogPostMetadata
|
||||||
blogPost =
|
blogPost =
|
||||||
@ -101,7 +101,7 @@ It's common to parse the body with a markdown parser or other format.
|
|||||||
|
|
||||||
import BackendTask exposing (BackendTask)
|
import BackendTask exposing (BackendTask)
|
||||||
import BackendTask.File as File
|
import BackendTask.File as File
|
||||||
import Decode as Decode exposing (Decoder)
|
import Decode exposing (Decoder)
|
||||||
import Html exposing (Html)
|
import Html exposing (Html)
|
||||||
|
|
||||||
example :
|
example :
|
||||||
@ -174,7 +174,7 @@ just the metadata.
|
|||||||
|
|
||||||
import BackendTask exposing (BackendTask)
|
import BackendTask exposing (BackendTask)
|
||||||
import BackendTask.File as File
|
import BackendTask.File as File
|
||||||
import Decode as Decode exposing (Decoder)
|
import Decode exposing (Decoder)
|
||||||
|
|
||||||
blogPost : BackendTask BlogPostMetadata
|
blogPost : BackendTask BlogPostMetadata
|
||||||
blogPost =
|
blogPost =
|
||||||
@ -198,7 +198,7 @@ the [`BackendTask`](BackendTask) API along with [`BackendTask.Glob`](BackendTask
|
|||||||
|
|
||||||
import BackendTask exposing (BackendTask)
|
import BackendTask exposing (BackendTask)
|
||||||
import BackendTask.File as File
|
import BackendTask.File as File
|
||||||
import Decode as Decode exposing (Decoder)
|
import Decode exposing (Decoder)
|
||||||
|
|
||||||
blogPostFiles : BackendTask (List String)
|
blogPostFiles : BackendTask (List String)
|
||||||
blogPostFiles =
|
blogPostFiles =
|
||||||
@ -231,8 +231,23 @@ onlyFrontmatter :
|
|||||||
}
|
}
|
||||||
frontmatter
|
frontmatter
|
||||||
onlyFrontmatter frontmatterDecoder filePath =
|
onlyFrontmatter frontmatterDecoder filePath =
|
||||||
read filePath
|
BackendTask.Internal.Request.request2
|
||||||
(frontmatter frontmatterDecoder)
|
{ name = "read-file"
|
||||||
|
, body = BackendTask.Http.stringBody "" filePath
|
||||||
|
, expect = frontmatter frontmatterDecoder
|
||||||
|
, errorDecoder = Decode.field "errorCode" (errorDecoder filePath)
|
||||||
|
, onError =
|
||||||
|
\frontmatterDecodeError ->
|
||||||
|
{ fatal =
|
||||||
|
{ title = "BackendTask.File Decoder Error"
|
||||||
|
, body =
|
||||||
|
"I encountered a Json Decoder error from a call to BackendTask.File.onlyFrontmatter.\n\n"
|
||||||
|
++ Decode.errorToString frontmatterDecodeError
|
||||||
|
}
|
||||||
|
|> FatalError.build
|
||||||
|
, recoverable = DecodingError frontmatterDecodeError
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
{-| Same as `bodyWithFrontmatter` except it doesn't include the frontmatter.
|
{-| Same as `bodyWithFrontmatter` except it doesn't include the frontmatter.
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
module BackendTask.Internal.Request exposing (request)
|
module BackendTask.Internal.Request exposing (request, request2)
|
||||||
|
|
||||||
import BackendTask exposing (BackendTask)
|
import BackendTask exposing (BackendTask)
|
||||||
import BackendTask.Http exposing (Body, Expect)
|
import BackendTask.Http exposing (Body, Error(..), Expect)
|
||||||
|
import Json.Decode exposing (Decoder)
|
||||||
|
import Json.Encode as Encode
|
||||||
|
|
||||||
|
|
||||||
request :
|
request :
|
||||||
@ -22,7 +24,50 @@ request ({ name, body, expect } as params) =
|
|||||||
}
|
}
|
||||||
expect
|
expect
|
||||||
|> BackendTask.onError
|
|> BackendTask.onError
|
||||||
(\_ ->
|
(\error ->
|
||||||
|
let
|
||||||
|
_ =
|
||||||
|
Debug.log "BackendTask.Internal.Request" error
|
||||||
|
in
|
||||||
-- TODO avoid crash here, this should be handled as an internal error
|
-- TODO avoid crash here, this should be handled as an internal error
|
||||||
request params
|
request params
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
request2 :
|
||||||
|
{ name : String
|
||||||
|
, body : Body
|
||||||
|
, expect : Decoder a
|
||||||
|
, errorDecoder : Decoder error
|
||||||
|
, onError : Json.Decode.Error -> error
|
||||||
|
}
|
||||||
|
-> BackendTask error a
|
||||||
|
request2 ({ name, body, expect, onError, errorDecoder } as params) =
|
||||||
|
-- elm-review: known-unoptimized-recursion
|
||||||
|
BackendTask.Http.request
|
||||||
|
{ url = "elm-pages-internal://" ++ name
|
||||||
|
, method = "GET"
|
||||||
|
, headers = []
|
||||||
|
, body = body
|
||||||
|
, timeoutInMs = Nothing
|
||||||
|
, retries = Nothing
|
||||||
|
}
|
||||||
|
(BackendTask.Http.expectJson Json.Decode.value)
|
||||||
|
|> BackendTask.onError
|
||||||
|
(\error ->
|
||||||
|
BackendTask.succeed Encode.null
|
||||||
|
)
|
||||||
|
|> BackendTask.andThen
|
||||||
|
(\decodeValue ->
|
||||||
|
case Json.Decode.decodeValue errorDecoder decodeValue of
|
||||||
|
Ok a ->
|
||||||
|
BackendTask.fail a
|
||||||
|
|
||||||
|
Err _ ->
|
||||||
|
case Json.Decode.decodeValue expect decodeValue of
|
||||||
|
Ok a ->
|
||||||
|
BackendTask.succeed a
|
||||||
|
|
||||||
|
Err e ->
|
||||||
|
BackendTask.fail (onError e)
|
||||||
|
)
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
module FatalError exposing (FatalError, fromString, recoverable)
|
module FatalError exposing
|
||||||
|
( FatalError, fromString, recoverable
|
||||||
|
, build
|
||||||
|
)
|
||||||
|
|
||||||
{-| The Elm language doesn't have the concept of exceptions or special control flow for errors. It just has
|
{-| The Elm language doesn't have the concept of exceptions or special control flow for errors. It just has
|
||||||
Custom Types, and by convention types like `Result` and the `Err` variant are used to represent possible failure states
|
Custom Types, and by convention types like `Result` and the `Err` variant are used to represent possible failure states
|
||||||
|
Loading…
Reference in New Issue
Block a user