Search code examples
functional-programmingelm

Build URL with conditional query parameters


I have simple url builder like this:

prepareUrl : Params -> String
prepareUrl params = 
   Url.crossOrigin "http://someapi.com/"
    ["posts"]
    [ 
    , Url.string "currency" params.currency
    , Url.string "members[0][birthday]" "12.12.1989"
    ]

When i receive param like membersCount 2 or 3 etc, i need to "clone" members[] in request like this:

params.membersCount = 3

prepareUrl : Params -> String
    prepareUrl params = 
       Url.crossOrigin "http://someapi.com/"
        ["posts"]
        [ 
        , Url.string "currency" params.currency
        , Url.string "members[0][birthday]" "12.12.1989"
        , Url.string "members[1][birthday]" "12.12.1989"
        , Url.string "members[2][birthday]" "12.12.1989"
        ]

The date string itself can remain the same, it doesn't matter. How can i do that?


Solution

  • Since the third parameter of Url.Builder.crossOrigin takes a list of QueryParameter values, you can build a list from 0 to memberCount using List.range:

    prepareUrl : Params -> String
    prepareUrl params = 
       Url.crossOrigin "http://someapi.com/"
        ["posts"]
        (Url.string "currency" params.currency :: birthdayParams params.memberCount)
    
    birthdayParams : Int -> List Url.QueryParameter
    birthdayParams memberCount =
        List.range 0 (memberCount - 1)
            |> List.map (\i -> Url.string ("members[" ++ String.fromInt i ++ "][birthday]") "12.12.1989")