Add Context type
							parent
							
								
									b3479cf2c9
								
							
						
					
					
						commit
						7254fcfaa4
					
				
							
								
								
									
										1
									
								
								elm.json
								
								
								
								
							
							
						
						
									
										1
									
								
								elm.json
								
								
								
								
							| 
						 | 
				
			
			@ -16,6 +16,7 @@
 | 
			
		|||
        "Internal.Tools.Iddict",
 | 
			
		||||
        "Internal.Tools.Timestamp",
 | 
			
		||||
        "Internal.Tools.VersionControl",
 | 
			
		||||
        "Internal.Values.Context",
 | 
			
		||||
        "Internal.Values.Envelope",
 | 
			
		||||
        "Internal.Values.Vault",
 | 
			
		||||
        "Types"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
module Internal.Config.Leaks exposing (accessToken)
 | 
			
		||||
module Internal.Config.Leaks exposing (accessToken, baseUrl, transaction, versions)
 | 
			
		||||
 | 
			
		||||
{-|
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ know 100% sure that the value isn't `Nothing`.
 | 
			
		|||
 | 
			
		||||
    Just 5 |> Maybe.withDefault Leaks.number
 | 
			
		||||
 | 
			
		||||
@docs accessToken
 | 
			
		||||
@docs accessToken, baseUrl, transaction, versions
 | 
			
		||||
 | 
			
		||||
-}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -37,3 +37,24 @@ know 100% sure that the value isn't `Nothing`.
 | 
			
		|||
accessToken : String
 | 
			
		||||
accessToken =
 | 
			
		||||
    "elm-sdk-placeholder-access-token-leaks"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Placeholder base URL.
 | 
			
		||||
-}
 | 
			
		||||
baseUrl : String
 | 
			
		||||
baseUrl =
 | 
			
		||||
    "elm-sdk-placeholder-baseurl-leaks.example.org"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Placeholder transaction id.
 | 
			
		||||
-}
 | 
			
		||||
transaction : String
 | 
			
		||||
transaction =
 | 
			
		||||
    "elm-sdk-placeholder-transaction-leaks"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Placeholder versions list.
 | 
			
		||||
-}
 | 
			
		||||
versions : List String
 | 
			
		||||
versions =
 | 
			
		||||
    [ "elm-sdk-placeholder-versions-leaks" ]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,196 @@
 | 
			
		|||
module Internal.Values.Context exposing
 | 
			
		||||
    ( Context, init, encode, decoder
 | 
			
		||||
    , APIContext, apiFormat
 | 
			
		||||
    , setAccessToken, getAccessToken
 | 
			
		||||
    , setBaseUrl, getBaseUrl
 | 
			
		||||
    , setTransaction, getTransaction
 | 
			
		||||
    , setVersions, getVersions
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
{-| The Context is the set of variables that the user (mostly) cannot control.
 | 
			
		||||
The Context contains tokens, values and other bits that the Vault receives from
 | 
			
		||||
the Matrix API.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Context
 | 
			
		||||
 | 
			
		||||
@docs Context, init, encode, decoder
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## APIContext
 | 
			
		||||
 | 
			
		||||
Once the API starts needing information, that's when we use the APIContext type
 | 
			
		||||
to build the right environment for the API communication to work with.
 | 
			
		||||
 | 
			
		||||
@docs APIContext, apiFormat
 | 
			
		||||
 | 
			
		||||
Once the APIContext is ready, there's helper functions for each piece of
 | 
			
		||||
information that can be inserted.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Access token
 | 
			
		||||
 | 
			
		||||
@docs setAccessToken, getAccessToken
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Base URL
 | 
			
		||||
 | 
			
		||||
@docs setBaseUrl, getBaseUrl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Transaction id
 | 
			
		||||
 | 
			
		||||
@docs setTransaction, getTransaction
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### Versions
 | 
			
		||||
 | 
			
		||||
@docs setVersions, getVersions
 | 
			
		||||
 | 
			
		||||
-}
 | 
			
		||||
 | 
			
		||||
import Internal.Config.Leaks as L
 | 
			
		||||
import Internal.Tools.Decode as D
 | 
			
		||||
import Internal.Tools.Encode as E
 | 
			
		||||
import Json.Decode as D
 | 
			
		||||
import Json.Encode as E
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| The Context type stores all the information in the Vault. This data type is
 | 
			
		||||
static and hence can be passed on easily.
 | 
			
		||||
-}
 | 
			
		||||
type alias Context =
 | 
			
		||||
    { accessToken : Maybe String
 | 
			
		||||
    , baseUrl : Maybe String
 | 
			
		||||
    , password : Maybe String
 | 
			
		||||
    , refreshToken : Maybe String
 | 
			
		||||
    , username : Maybe String
 | 
			
		||||
    , transaction : Maybe String
 | 
			
		||||
    , versions : Maybe (List String)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| The APIContext is a separate type that uses a phantom type to trick the
 | 
			
		||||
compiler into requiring values to be present. This data type is used to gather
 | 
			
		||||
the right variables (like an access token) before accessing the Matrix API.
 | 
			
		||||
-}
 | 
			
		||||
type APIContext ph
 | 
			
		||||
    = APIContext
 | 
			
		||||
        { accessToken : String
 | 
			
		||||
        , baseUrl : String
 | 
			
		||||
        , context : Context
 | 
			
		||||
        , transaction : String
 | 
			
		||||
        , versions : List String
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Create an unformatted APIContext type.
 | 
			
		||||
-}
 | 
			
		||||
apiFormat : Context -> APIContext {}
 | 
			
		||||
apiFormat context =
 | 
			
		||||
    APIContext
 | 
			
		||||
        { accessToken = context.accessToken |> Maybe.withDefault L.accessToken
 | 
			
		||||
        , baseUrl = context.baseUrl |> Maybe.withDefault L.baseUrl
 | 
			
		||||
        , context = context
 | 
			
		||||
        , transaction = context.transaction |> Maybe.withDefault L.transaction
 | 
			
		||||
        , versions = context.versions |> Maybe.withDefault L.versions
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Decode a Context type from a JSON value.
 | 
			
		||||
-}
 | 
			
		||||
decoder : D.Decoder Context
 | 
			
		||||
decoder =
 | 
			
		||||
    D.map7 Context
 | 
			
		||||
        (D.opField "accessToken" D.string)
 | 
			
		||||
        (D.opField "baseUrl" D.string)
 | 
			
		||||
        (D.opField "password" D.string)
 | 
			
		||||
        (D.opField "refreshToken" D.string)
 | 
			
		||||
        (D.opField "username" D.string)
 | 
			
		||||
        (D.opField "transaction" D.string)
 | 
			
		||||
        (D.opField "versions" (D.list D.string))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Encode a Context type into a JSON value.
 | 
			
		||||
-}
 | 
			
		||||
encode : Context -> E.Value
 | 
			
		||||
encode context =
 | 
			
		||||
    E.maybeObject
 | 
			
		||||
        [ ( "accessToken", Maybe.map E.string context.accessToken )
 | 
			
		||||
        , ( "baseUrl", Maybe.map E.string context.baseUrl )
 | 
			
		||||
        , ( "password", Maybe.map E.string context.password )
 | 
			
		||||
        , ( "refreshToken", Maybe.map E.string context.refreshToken )
 | 
			
		||||
        , ( "username", Maybe.map E.string context.username )
 | 
			
		||||
        , ( "transaction", Maybe.map E.string context.transaction )
 | 
			
		||||
        , ( "versions", Maybe.map (E.list E.string) context.versions )
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| A basic, untouched version of the Context, containing no information.
 | 
			
		||||
-}
 | 
			
		||||
init : Context
 | 
			
		||||
init =
 | 
			
		||||
    { accessToken = Nothing
 | 
			
		||||
    , baseUrl = Nothing
 | 
			
		||||
    , refreshToken = Nothing
 | 
			
		||||
    , password = Nothing
 | 
			
		||||
    , username = Nothing
 | 
			
		||||
    , transaction = Nothing
 | 
			
		||||
    , versions = Nothing
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Get an inserted access token.
 | 
			
		||||
-}
 | 
			
		||||
getAccessToken : APIContext { a | accessToken : () } -> String
 | 
			
		||||
getAccessToken (APIContext c) =
 | 
			
		||||
    c.accessToken
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Insert an access token into the APIContext.
 | 
			
		||||
-}
 | 
			
		||||
setAccessToken : String -> APIContext a -> APIContext { a | accessToken : () }
 | 
			
		||||
setAccessToken value (APIContext c) =
 | 
			
		||||
    APIContext { c | accessToken = value }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Get an inserted base URL.
 | 
			
		||||
-}
 | 
			
		||||
getBaseUrl : APIContext { a | baseUrl : () } -> String
 | 
			
		||||
getBaseUrl (APIContext c) =
 | 
			
		||||
    c.baseUrl
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Insert a base URL into the APIContext.
 | 
			
		||||
-}
 | 
			
		||||
setBaseUrl : String -> APIContext a -> APIContext { a | baseUrl : () }
 | 
			
		||||
setBaseUrl value (APIContext c) =
 | 
			
		||||
    APIContext { c | baseUrl = value }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Get an inserted transaction id.
 | 
			
		||||
-}
 | 
			
		||||
getTransaction : APIContext { a | transaction : () } -> String
 | 
			
		||||
getTransaction (APIContext c) =
 | 
			
		||||
    c.transaction
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Insert a transaction id into the APIContext.
 | 
			
		||||
-}
 | 
			
		||||
setTransaction : String -> APIContext a -> APIContext { a | transaction : () }
 | 
			
		||||
setTransaction value (APIContext c) =
 | 
			
		||||
    APIContext { c | transaction = value }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Get an inserted versions list.
 | 
			
		||||
-}
 | 
			
		||||
getVersions : APIContext { a | versions : () } -> List String
 | 
			
		||||
getVersions (APIContext c) =
 | 
			
		||||
    c.versions
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{-| Insert a versions list into the APIContext.
 | 
			
		||||
-}
 | 
			
		||||
setVersions : List String -> APIContext a -> APIContext { a | versions : () }
 | 
			
		||||
setVersions value (APIContext c) =
 | 
			
		||||
    APIContext { c | versions = value }
 | 
			
		||||
		Loading…
	
		Reference in New Issue