Source

ocaml-bitbucket / api.ml

open Common
open Tiny_json
open Json_conv
open Meta_conv.Open
open Sexplib.Conv

module Json = struct
  include Json
  let sexp_of_t j = Sexplib.Sexp.Atom (Json.show j)
  let t_of_sexp = function
    | Sexplib.Sexp.Atom s -> Json.parse s
    | _ -> assert false
end

module Address = struct
  include Meta_conv.Types.Address
  let sexp_of_t _ = Sexplib.Sexp.Atom ""
  let t_of_sexp _ = top
end

type 'target fields = (string * ('target * Address.t)) list with sexp

module Scheme = struct
  type t = Hg(:"hg":) | Git(:"git":) with conv(json), sexp
end

(** repositories Endpoint *)
module Repositories = struct

  module Repository = struct
    type t = {
      scm               : Scheme.t;
      has_wiki          : bool;
      last_updated      : string;
      created_on        : string;
      owner             : string;
      logo              : string;
      email_mailinglist : string option;
      is_mq             : bool;
      size              : int;
      read_only         : bool;
      followers_count   : int;
      state             : string; (* "str(available)" *)
      utc_created_on    : string;
      website           : string option;
      description       : string option;
      has_issues        : bool;
      is_fork           : bool;
      slug              : string;
      is_private        : bool;
      name              : string;
      language          : string;
      utc_last_updated  : string;
      email_writers     : bool;
      no_public_forks   : bool;
      resource_uri      : string;
      fork_of           : t option;
      mq_of             : t option;
      creator           : string option;
    } with conv(json), sexp
  end


end

(** user Endpoint *)
module User = struct

  type user = {
    username     : string;
    first_name   : string;
    last_name    : string;
    is_team      : bool;
    avatar       : string;
    resource_uri : string
  } with conv(json), sexp

  type resp = {
    user : user;
    repositories : Repositories.Repository.t list;
  } with conv(json), sexp

  let get ~user ~password = 
    let s = Curl.get_string (fun h ->
      h#set_url "https://api.bitbucket.org/1.0/user";
      h#set_userpwd (Printf.sprintf "%s:%s" user password))
    in
    try resp_of_json_exn (Json.parse s) with e -> 
      prerr_endline (Printexc.to_string e);
      prerr_endline s;
      raise e

  module Repositories = struct

    type repo = { 
      owner      : string;
      scm        : Scheme.t;
      slug       : string;
      is_private : bool;
      name       : string
    } 

    and resp = repo list with conv(json)

    let get ~user ~password = 
      resp_of_json (Json.parse (Curl.get_string (fun h ->
        h#set_url "https://api.bitbucket.org/1.0/user/repositories/";
        h#set_userpwd (Printf.sprintf "%s:%s" user password))))
  end

end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.