1module UI.Sources.Query exposing (..)
2
3import Dict
4import Json.Decode as Decode
5import Sources exposing (Source)
6import Url exposing (Url)
7import Url.Parser as Url
8import Url.Parser.Query as Query
9
10
11requestedAddition : Url -> Bool
12requestedAddition url =
13 case Url.parse (urlParser identity) url of
14 Nothing ->
15 False
16
17 Just [] ->
18 False
19
20 Just (_ :: _) ->
21 True
22
23
24sourcesFromUrl : Url -> List Source
25sourcesFromUrl url =
26 url
27 |> Url.parse (urlParser <| List.filterMap fromUrl)
28 |> Maybe.withDefault []
29
30
31
32-- 🔬
33
34
35fromUrl : String -> Maybe Source
36fromUrl json =
37 json
38 |> Decode.decodeString sourceParser
39 |> Result.toMaybe
40
41
42urlParser individualParser =
43 individualParser
44 |> Query.custom "source"
45 |> Url.query
46
47
48sourceParser : Decode.Decoder Source
49sourceParser =
50 Decode.andThen
51 (\{ service, data } ->
52 if Dict.member "name" data then
53 Decode.succeed
54 { id = "FILL_IN_LATER"
55 , data = data
56 , directoryPlaylists = True
57 , enabled = True
58 , service = service
59 }
60
61 else
62 Decode.fail "Missing `name` in `data` dictionary"
63 )
64 <|
65 Decode.map2
66 (\s d -> { service = s, data = d })
67 (Decode.field "kind" Sources.serviceDecoder)
68 (Decode.field "data" <| Decode.dict Decode.string)