Source

ocaml-bitbucket / api.ml

Diff from to

File api.ml

 open Meta_conv.Open
 open Sexplib.Conv
 
-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
-type 'target mc_leftovers = 'target fields with sexp
+type 'target mc_fields = (string * 'target) list with sexp
+type 'target mc_leftovers = 'target mc_fields with sexp
 
 module Json = struct
   include Json
   let t_of_sexp = function
     | Sexplib.Sexp.Atom s -> Json.parse s
     | _ -> assert false
-
-  type 'a named_list = (string * 'a) list with sexp
-  let json_of_named_list : ('a -> t) -> 'a named_list -> t = fun f xs -> 
-    Object (List.map (fun (name, a) -> (name, f a)) xs)
-  let named_list_of_json (d : 'a decoder) : (string * 'a) list decoder = fun ?(adrs=[]) ->
-    function
-      | Object fields -> 
-          let adrs = 0::adrs in (* CR jfuruse: wrong! *)
-          `Ok (List.map (fun (name, v) -> (name, d ~adrs v)) fields)
-      | v -> `Error (Meta_conv.Types.Error.Primitive_decoding_failure "Object expected for named list", 
-                     v,
-                     adrs)
-
-  let named_list_of_json_exn d ?adrs v = 
-    match named_list_of_json d ?adrs v with
-    | `Ok v -> v
-    | `Error err -> raise (Json_conv.Error err)
-    
 end
 
 module Scheme = struct
   (* https://api.bitbucket.org/1.0/repositories/{accountname}/{repo_slug}/branches *)
   module Branches = struct
 
+    type file = {
+      type_ as "type" : string;
+      file : string;
+    } with conv(json), sexp
+
     type branch = {
+      node : string;
+      raw_node : string;
+      author : string;
+      raw_author : string;
+      utctimestamp : UTCTime.t;
+      timestamp : LocalTime.t;
+      message : string;
+      files : file list;
+      size : int64;
+      revision : int64;
+      parents : string list;
+      branch : string;
       unknown : Json.t mc_leftovers;
     } with conv(json), sexp
 
-    type t = branch Json.named_list with conv(json), sexp
+    type t = branch mc_fields with conv(json), sexp
 
     let get ~accountname ~repo_slug = 
-      let s = Curl.get_string (fun h ->
+      Format.eprintf "%s : %s...@." accountname repo_slug;
+      let code, s  = Curl.get_string (fun h ->
+        (* ~user ~password  *)
+        (* h#set_userpwd (Printf.sprintf "%s:%s" user password)) *)
         h#set_url (sprintf "https://api.bitbucket.org/1.0/repositories/%s/%s/branches" accountname repo_slug);
         (* h#set_userpwd (Printf.sprintf "%s:%s" user password) *))
       in
       try t_of_json_exn (Json.parse s) with e -> 
         prerr_endline (Printexc.to_string e);
-        prerr_endline s;
+        Format.eprintf "%d: %S@." code s;
         raise e
       
   end
   type t = {
     user : user;
     repositories : Repositories.Repository.t list;
-    rest (: Leftovers :) : Json.t fields;
+    rest (: Leftovers :) : Json.t mc_fields;
   } with conv(json), sexp
 
   let get ~user ~password = 
-    let s = Curl.get_string (fun h ->
+    let _code, 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
     and resp = repo list with conv(json)
 
     let get ~user ~password = 
-      resp_of_json (Json.parse (Curl.get_string (fun h ->
+      let _code, s = 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))))
+        h#set_userpwd (Printf.sprintf "%s:%s" user password))
+      in
+      resp_of_json (Json.parse s)
   end
 
 end