1module Sources.Services.AmazonS3.Parser exposing (parseErrorResponse, parseTreeResponse)
2
3import Conditional exposing (..)
4import Sources.Processing exposing (Marker(..), TreeAnswer)
5import Xml.Decode exposing (..)
6
7
8
9-- TREE
10
11
12parseTreeResponse : String -> Marker -> TreeAnswer Marker
13parseTreeResponse response _ =
14 response
15 |> decodeString
16 (map2
17 (\f m -> { filePaths = f, marker = m })
18 filePathsDecoder
19 markerDecoder
20 )
21 |> Result.withDefault { filePaths = [], marker = TheEnd }
22
23
24filePathsDecoder : Decoder (List String)
25filePathsDecoder =
26 string
27 |> single
28 |> path [ "Key" ]
29 |> list
30 |> path [ "Contents" ]
31
32
33markerDecoder : Decoder Marker
34markerDecoder =
35 map2
36 (\a b ->
37 Maybe.withDefault
38 TheEnd
39 (Maybe.map2
40 (\isTruncated token ->
41 ifThenElse (isTruncated == "true") (InProgress token) TheEnd
42 )
43 a
44 b
45 )
46 )
47 (maybe <| path [ "IsTruncated" ] <| single string)
48 (maybe <| path [ "NextContinuationToken" ] <| single string)
49
50
51
52-- ERROR
53
54
55parseErrorResponse : String -> Maybe String
56parseErrorResponse response =
57 response
58 |> decodeString errorMessagesDecoder
59 |> Result.toMaybe
60
61
62errorMessagesDecoder : Decoder String
63errorMessagesDecoder =
64 string
65 |> single
66 |> path [ "Message" ]