ybbond-reason

My old site written in ReasonReact
Log | Files | Refs | README | LICENSE | CC-LICENSE

BlogGistData.re (4134B)


      1 let apiBaseUrl = "https://api.github.com/users/ybbond/gists";
      2 
      3 type gist_file_content = {
      4   filename: string,
      5   language: option(string),
      6   raw_url: string,
      7   size: int,
      8   type_: string,
      9 };
     10 
     11 type gist_files = Js.Dict.t(gist_file_content);
     12 
     13 type owner_content = {
     14   avatar_url: string,
     15   events_url: string,
     16   followers_url: string,
     17   following_url: string,
     18   gists_url: string,
     19   gravatar_id: string,
     20   html_url: string,
     21   id: int,
     22   login: string,
     23   node_id: string,
     24   organizations_url: string,
     25   received_events_url: string,
     26   repos_url: string,
     27   site_admin: bool,
     28   starred_url: string,
     29   subscriptions_url: string,
     30   type_: string,
     31   url: string,
     32 };
     33 
     34 type gist_type = {
     35   comments: int,
     36   comments_url: string,
     37   commits_url: string,
     38   created_at: string,
     39   description: string,
     40   files: gist_files,
     41   forks_url: string,
     42   git_pull_url: string,
     43   git_push_url: string,
     44   html_url: string,
     45   id: string,
     46   node_id: string,
     47   owner: owner_content,
     48   public: bool,
     49   truncated: bool,
     50   updated_at: string,
     51   url: string,
     52 };
     53 
     54 type gist_return = array(gist_type);
     55 
     56 module Decode = {
     57   let gistFileContent = (json): gist_file_content => {
     58     Json.Decode.{
     59       filename: json |> field("filename", string),
     60       language: json |> field("language", optional(string)),
     61       raw_url: json |> field("raw_url", string),
     62       size: json |> field("size", int),
     63       type_: json |> field("type", string),
     64     };
     65   };
     66 
     67   let gistFiles = (json): gist_files => {
     68     json |> Json.Decode.dict(gistFileContent);
     69   };
     70 
     71   let ownerContent = (json): owner_content => {
     72     Json.Decode.{
     73       avatar_url: json |> field("avatar_url", string),
     74       events_url: json |> field("events_url", string),
     75       followers_url: json |> field("followers_url", string),
     76       following_url: json |> field("following_url", string),
     77       gists_url: json |> field("gists_url", string),
     78       gravatar_id: json |> field("gravatar_id", string),
     79       html_url: json |> field("html_url", string),
     80       id: json |> field("id", int),
     81       login: json |> field("login", string),
     82       node_id: json |> field("node_id", string),
     83       organizations_url: json |> field("organizations_url", string),
     84       received_events_url: json |> field("received_events_url", string),
     85       repos_url: json |> field("repos_url", string),
     86       site_admin: json |> field("site_admin", bool),
     87       starred_url: json |> field("starred_url", string),
     88       subscriptions_url: json |> field("subscriptions_url", string),
     89       type_: json |> field("type", string),
     90       url: json |> field("url", string),
     91     };
     92   };
     93 
     94   let gist = (json): gist_type => {
     95     Json.Decode.{
     96       comments: json |> field("comments", int),
     97       comments_url: json |> field("commits_url", string),
     98       commits_url: json |> field("commits_url", string),
     99       created_at: json |> field("created_at", string),
    100       description: json |> field("description", string),
    101       files: json |> field("files", gistFiles),
    102       forks_url: json |> field("forks_url", string),
    103       git_pull_url: json |> field("git_pull_url", string),
    104       git_push_url: json |> field("git_push_url", string),
    105       html_url: json |> field("html_url", string),
    106       id: json |> field("id", string),
    107       node_id: json |> field("node_id", string),
    108       owner: json |> field("owner", ownerContent),
    109       public: json |> field("public", bool),
    110       truncated: json |> field("truncated", bool),
    111       updated_at: json |> field("updated_at", string),
    112       url: json |> field("url", string),
    113     };
    114   };
    115   let decodeReturnValue = Json.Decode.array(gist);
    116 };
    117 
    118 let fetchGist = callback =>
    119   Js.Promise.(
    120     Fetch.fetch(apiBaseUrl)
    121     |> then_(Fetch.Response.json)
    122     |> then_(data_array =>
    123          Json.stringify(data_array)
    124          |> Json.parseOrRaise
    125          |> Decode.decodeReturnValue
    126          |> (
    127            gistContent => {
    128              callback(gistContent);
    129              resolve();
    130            }
    131          )
    132        )
    133   );
    134 
    135 let fetchBlog = (callback, link) =>
    136   Js.Promise.(
    137     Fetch.fetch(link)
    138     |> then_(Fetch.Response.text)
    139     |> then_(blog => {
    140          callback(blog);
    141          resolve();
    142        })
    143   );