Type conflict in promise


#1

Hi all

I have the following code, that is not compiled:

let keycloakQuery = (config: Config.env) => 
  Security.query
  |> Js.Promise.then_(p: Security.pool => {
    let url: string = config.url ++ "/foo/" ++ p##subject ++ "/foo";

    let keycloak = Axios.makeConfigWithUrl(~url=url, 
    ~_method="GET", 
    ~headers={"Authorization": "Bearer " ++ p##token},
    ());
  
    Axios.request(keycloak);
  });

the compiler complains:

22 ┆   ());
  23 ┆
  24 ┆   Axios.request(keycloak);
  25 ┆ });
  26 ┆

  This has type:
    Js.Promise.t(Axios_types.response('a, 'b)) (defined as
      Js.Promise.t(Axios_types.response('a, 'b)))
  But somewhere wanted:
    Cockpit.Security.pool (defined as {. "subject": string, "token": string})

ninja: build stopped: subcommand failed.
>>>> Finish compiling(exit: 1)

The security pool

type pool = Js.t({
  .
  subject: string,
  token: string
});

let query: Js.Promise.t(pool) = [%raw {|
  new Promise((resolve, reject) => {
    keycloak.init({
        onLoad: 'login-required'
      }).success(() => resolve({subject: keycloak.subject, token: keycloak.token)).error(error => reject(error))
    })
  |}];  

What am I doing wrong?

Thanks


#2

I’ve got the solution:

let request = (c: coins => unit) =>
  Config.read
  |> Js.Promise.then_(x => keycloakQuery(x)) 
  |> Js.Promise.then_(x => Js.Promise.resolve(Array.to_list(x##data)))
  |> Js.Promise.then_(x => Js.Promise.resolve(transformToCoins(x)))
  |> Js.Promise.then_(x => Js.Promise.resolve(c(x)));