/src/twilio_rest.ml

https://github.com/skydeck/twilio-ocaml · OCaml · 282 lines · 226 code · 51 blank · 5 comment · 0 complexity · aa9274b1a6d2c7dca816aae828e686c9 MD5 · raw file

  1. let (|>) x f = f x
  2. open Twilio_types
  3. let identity x = x
  4. module Make(A : sig
  5. type 'a _r
  6. val (>>=) : 'a _r -> ('a -> 'b _r) -> 'b _r
  7. val return : 'a -> 'a _r
  8. val account_sid : string
  9. val send : Http_client.http_call -> http_call_result _r
  10. end) = struct
  11. module Request = Twilio_rest_request.Make(struct
  12. type 'a _r = 'a A._r
  13. let return = A.return
  14. let account_sid = A.account_sid
  15. end)
  16. let (>>=) = A.(>>=)
  17. let add_auth http_call =
  18. (* We add the authorization header ourselves instead of using netclient.
  19. The problem with netclient is that it (a) does not work with POST for
  20. Twilio's API and (b) requires two server connections (even when
  21. enable_auth_in_advance is true).
  22. *)
  23. http_call
  24. let send_delete url = failwith "TODO"
  25. let send_get url = new Http_client.get url |> add_auth |> A.send
  26. let send_post (url, args) = new Http_client.post url args |> add_auth |> A.send
  27. let return of_string s =
  28. A.return (match s with
  29. | `Success s -> (try `Success (of_string s) with e -> print_endline (Printexc.to_string e); print_endline (Printexc.get_backtrace ()); `Parse_error (e, s))
  30. | `Unserved -> `Unserved
  31. | `Http_protocol_error e -> `Http_protocol_error e
  32. | `Redirection -> `Redirection
  33. | `Client_error -> `Client_error
  34. | `Server_error -> `Server_error
  35. | `Timeout -> `Timeout
  36. )
  37. module Available_phone_numbers = struct
  38. open Request.Available_phone_numbers
  39. module Local = struct
  40. let get ?area_code ?contains ?in_region ?in_postal_code iso_code =
  41. Local.get ?area_code ?contains ?in_region ?in_postal_code iso_code
  42. >>= send_get
  43. >>= return Available_phone_numbers_local_j.response_of_string
  44. end
  45. module Toll_free = struct
  46. let get ?contains iso_code =
  47. Toll_free.get ?contains iso_code
  48. >>= send_get
  49. >>= return Available_phone_numbers_tollfree_j.response_of_string
  50. end
  51. end
  52. module Outgoing_caller_ids = struct
  53. open Request.Outgoing_caller_ids
  54. open Outgoing_caller_ids_j
  55. module Sid = struct
  56. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  57. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  58. let post friendly_name sid = Sid.post friendly_name sid >>= send_post >>= return post_result_of_string
  59. end
  60. let get ?phone_number ?friendly_name () =
  61. get ?phone_number ?friendly_name () >>= send_get >>= return page_of_string
  62. let post ?friendly_name ?call_delay ?extension phone_number =
  63. post ?friendly_name ?call_delay ?extension phone_number
  64. >>= send_post
  65. >>= return post_result_of_string
  66. end
  67. module Incoming_phone_numbers = struct
  68. open Request.Incoming_phone_numbers
  69. open Incoming_phone_numbers_j
  70. module Sid = struct
  71. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  72. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  73. let post ?friendly_name ?api_version ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler ?account_sid sid =
  74. Sid.post ?friendly_name ?api_version ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler ?account_sid sid
  75. >>= send_post
  76. >>= return t_of_string
  77. end
  78. let get ?phone_number ?friendly_name () =
  79. get ?phone_number ?friendly_name () >>= send_get >>= return page_of_string
  80. let post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number =
  81. post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number
  82. >>= send_post
  83. >>= return t_of_string
  84. module Local = struct
  85. let get ?phone_number ?friendly_name () =
  86. Local.get ?phone_number ?friendly_name () >>= send_get >>= return page_of_string
  87. let post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number =
  88. Local.post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number
  89. >>= send_post
  90. >>= return t_of_string
  91. end
  92. module Toll_free = struct
  93. let get ?phone_number ?friendly_name () =
  94. Toll_free.get ?phone_number ?friendly_name () >>= send_get >>= return page_of_string
  95. let post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number =
  96. Toll_free.post ?friendly_name ?voice_handler ?status_callback ?voice_callerid_lookup ?sms_handler number
  97. >>= send_post
  98. >>= return t_of_string
  99. end
  100. end
  101. module Applications = struct
  102. open Request.Applications
  103. open Applications_j
  104. module Sid = struct
  105. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  106. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  107. let post ?friendly_name ?api_version ?voice_callback ?status_callback ?voice_callerid_lookup ?sms_callback sid =
  108. Sid.post ?friendly_name ?api_version ?voice_callback ?status_callback ?voice_callerid_lookup ?sms_callback sid
  109. >>= send_post
  110. >>= return t_of_string
  111. end
  112. let get ?friendly_name () = get ?friendly_name () >>= send_get >>= return page_of_string
  113. let post ?api_version ?voice_callback ?status_callback ?voice_callerid_lookup ?sms_callback friendly_name =
  114. post ?api_version ?voice_callback ?status_callback ?voice_callerid_lookup ?sms_callback friendly_name
  115. >>= send_post
  116. >>= return t_of_string
  117. end
  118. module Connect_apps = struct
  119. open Request.Connect_apps
  120. open Connect_apps_j
  121. module Sid = struct
  122. let post ?friendly_name ?authorized_redirect_url ?deauthorize_callback ?permissions ?description ?company_name ?homepage_url sid =
  123. Sid.post ?friendly_name ?authorized_redirect_url ?deauthorize_callback ?permissions ?description ?company_name ?homepage_url sid
  124. >>= send_post
  125. >>= return t_of_string
  126. end
  127. let get () = get () >>= send_get >>= return page_of_string
  128. end
  129. module Authorized_connect_apps = struct
  130. open Request.Authorized_connect_apps
  131. open Authorized_connect_apps_j
  132. module Sid = struct
  133. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  134. end
  135. let get () = get () >>= send_get >>= return page_of_string
  136. end
  137. module Transcriptions = struct
  138. open Request.Transcriptions
  139. open Transcriptions_j
  140. module Sid = struct
  141. let get format sid =
  142. let of_string s =
  143. match format with
  144. | `Json -> `Json (t_of_string s)
  145. | `Txt -> `Txt s
  146. in
  147. Sid.get format sid >>= send_get >>= return of_string
  148. end
  149. let get () = get () >>= send_get >>= return page_of_string
  150. end
  151. module Recordings =
  152. struct
  153. open Request.Recordings
  154. open Recordings_j
  155. module Sid = struct
  156. let get format sid =
  157. let of_string s =
  158. match format with
  159. | `Wav -> `Wav s
  160. | `Mp3 -> `Mp3 s
  161. | `Txt -> `Txt s
  162. | `Xml -> `Xml s
  163. in
  164. Sid.get format sid >>= send_get >>= return of_string
  165. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  166. end
  167. let get ?call_sid ?date_created () =
  168. get ?call_sid ?date_created () >>= send_get >>= return t_of_string
  169. module Transcriptions = struct
  170. open Transcriptions_j
  171. let get sid = Transcriptions.get sid >>= send_get >>= return t_of_string
  172. end
  173. end
  174. module Notifications = struct
  175. open Request.Notifications
  176. open Notifications_j
  177. module Sid = struct
  178. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  179. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  180. end
  181. let get ?log ?message_date () =
  182. get ?log ?message_date () >>= send_get >>= return t_of_string
  183. end
  184. module Calls = struct
  185. open Request.Calls
  186. open Calls_j
  187. module Sid = struct
  188. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  189. let delete sid = Sid.delete sid >>= send_delete >>= return identity
  190. let post ?twiml_url ?meth ?status sid =
  191. Sid.post ?twiml_url ?meth ?status sid
  192. >>= send_post
  193. >>= return t_of_string
  194. end
  195. let get ?to_number ?from_number ?status ?start_time () =
  196. get ?to_number ?from_number ?status ?start_time ()
  197. >>= send_get
  198. >>= return t_of_string
  199. let post ?status_callback ?send_digits ?if_machine ?timeout ~handler ~from_number ~to_number () =
  200. post ?status_callback ?send_digits ?if_machine ?timeout ~handler ~from_number ~to_number ()
  201. >>= send_post
  202. >>= return t_of_string
  203. module Recordings = struct
  204. open Recordings_j
  205. let get ?date_created sid =
  206. Recordings.get ?date_created sid >>= send_get >>= return t_of_string
  207. end
  208. module Notifications = struct
  209. open Notifications_j
  210. let get ?log ?message_date sid =
  211. Notifications.get ?log ?message_date sid >>= send_get >>= return t_of_string
  212. end
  213. end
  214. module Sms = struct
  215. module Messages = struct
  216. open Request.Sms.Messages
  217. open Sms_messages_j
  218. module Sid = struct
  219. let get sid = Sid.get sid >>= send_get >>= return t_of_string
  220. end
  221. let get ?from_number ?to_number ?date_sent () =
  222. get ?from_number ?to_number ?date_sent ()
  223. >>= send_get
  224. >>= return page_of_string
  225. let post ?callback ~from_number ~to_number ~body () =
  226. post ?callback ~from_number ~to_number ~body ()
  227. >>= send_post
  228. >>= return t_of_string
  229. end
  230. end
  231. end