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 );