aboutsummaryrefslogtreecommitdiff
path: root/sx-method.el
diff options
context:
space:
mode:
Diffstat (limited to 'sx-method.el')
-rw-r--r--sx-method.el74
1 files changed, 54 insertions, 20 deletions
diff --git a/sx-method.el b/sx-method.el
index e9c4f60..feebd84 100644
--- a/sx-method.el
+++ b/sx-method.el
@@ -25,32 +25,66 @@
(require 'json)
(require 'url)
(require 'sx)
+(require 'sx-auth)
(require 'sx-request)
(require 'sx-filter)
-(defun sx-method-call
- (method &optional keyword-arguments filter need-auth use-post silent)
- "Call METHOD with KEYWORD-ARGUMENTS using FILTER.
+(cl-defun sx-method-call (method &key id
+ submethod
+ keywords
+ (filter 'none)
+ auth
+ (url-method "GET")
+ (site sx-site-default))
+ "Call METHOD with additional keys.
-If NEED-AUTH is non-nil, an auth-token is required. If 'WARN,
-warn the user `(user-error ...)' if they do not have an AUTH
-token set.
-
-If USE-POST is non-nil, use `POST' rather than `GET' for passing
-arguments.
-
-If SILENT is non-nil, no messages will be printed.
+:ID is the id associated with a question, answer, comment, post or
+user.
+:SUBMETHOD is the additional segments of the method.
+:KEYWORDS are the api parameters.
+:FILTER is the set of filters to control the returned information
+:AUTH defines how to act if the method or filters require
+authentication.
+:URL-METHOD is either \"POST\" or \"GET\"
+:SITE is the api parameter specifying the site.
Return the entire response as a complex alist."
- (sx-request-make
- method
- (cons (cons 'filter
- (sx-filter-get-var
- (cond (filter filter)
- ((boundp 'stack-filter) stack-filter))))
- keyword-arguments)
- need-auth
- use-post))
+ (let ((access-token (sx-cache-get 'auth))
+ (method-auth (sx-auth--method-p method submethod))
+ (filter-auth (sx-auth--filter-p filter))
+ (full-method (concat (format "%s" method)
+ (when id
+ (format "/%s" id))
+ (when submethod
+ (format "/%s" submethod))))
+ (call 'sx-request-make))
+ (lwarn "sx-call-method" :warning "A: %S T: %S. M: %S,%s. F: %S" (equal 'warn auth)
+ access-token method-auth full-method filter-auth)
+ (unless access-token
+ (cond
+ ;; 1. Need auth and warn user (interactive use)
+ ((and method-auth (equal 'warn auth))
+ (user-error
+ "This request requires authentication. Please run `M-x sx-auth-authenticate' and try again."))
+ ;; 2. Need auth to populate UI, cannot provide subset
+ ((and method-auth auth)
+ (setq call 'sx-request-fallback))
+ ;; 3. Need auth for type. Use auth-less filter.
+ ((and filter-auth auth)
+ (setq filter filter-auth))
+ ;; 4. Requires auth but no value set for auth
+ ((and (or filter-auth method-auth) (not auth))
+ (error "This request requires authentication."))))
+ ;; Concatenate all parameters now that filter is ensured.
+ (setq parameters
+ (cons `(site . ,site)
+ (cons (cons 'filter
+ (sx-filter-get-var filter))
+ keywords)))
+ (funcall call
+ full-method
+ parameters
+ url-method)))
(provide 'sx-method)
;;; sx-method.el ends here