Compare commits
6 Enmetoj
master
...
Ambrevar/m
Author | SHA1 | Date | |
---|---|---|---|
Pierre Neidhardt | 63ab330868 | ||
Pierre Neidhardt | a1c5281a38 | ||
Pierre Neidhardt | ed93813417 | ||
Pierre Neidhardt | 09ebe83f37 | ||
Pierre Neidhardt | a52676d5c3 | ||
Pierre Neidhardt | cc65064550 |
|
@ -5,7 +5,7 @@ CL-IPFS-API²
|
||||||
:cl-ipfs-api² is a pretty simple set of IPFS bindings for Common Lisp, using
|
:cl-ipfs-api² is a pretty simple set of IPFS bindings for Common Lisp, using
|
||||||
the HTTP API for (almost) everything, except for pubsub (which uses the locally
|
the HTTP API for (almost) everything, except for pubsub (which uses the locally
|
||||||
installed go-ipfs program).
|
installed go-ipfs program).
|
||||||
It uses Drakma, YASON, and UIOP.
|
It uses Dexador, YASON, and UIOP.
|
||||||
|
|
||||||
|
|
||||||
————————————————————————————————————————
|
————————————————————————————————————————
|
||||||
|
@ -118,5 +118,6 @@ BORING STUFF
|
||||||
————————————————————————————————————————
|
————————————————————————————————————————
|
||||||
License is the GNU LGPLv3:
|
License is the GNU LGPLv3:
|
||||||
check COPYING.txt (/ipfs/QmR8Rnk5QdXgrXRqmgMLmG5PuHZEjujfa3rfVhPV99TLY7)
|
check COPYING.txt (/ipfs/QmR8Rnk5QdXgrXRqmgMLmG5PuHZEjujfa3rfVhPV99TLY7)
|
||||||
Author is Jaidyn Ann <jadedctrl@posteo.at>
|
Author is Jaidyn Ann <jadedctrl@teknik.io>
|
||||||
Sauce is at https://hak.xwx.moe/jadedctrl/cl-ipfs-api2
|
Sauce is at https://git.feneas.org/detruota/cl-ipfs-api2
|
||||||
|
https://github.com/JadedCtrl/cl-ipfs-api2
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
(defsystem "cl-ipfs-api2"
|
(defsystem "cl-ipfs-api2"
|
||||||
:version "0.51"
|
:version "0.51"
|
||||||
:license "LGPLv3"
|
:license "LGPLv3"
|
||||||
:author "Jaidyn Ann <jadedctrl@posteo.at>"
|
:author "Jaidyn Ann <jadedctrl@teknik.io>"
|
||||||
:description "Bindings for the IPFS HTTP API."
|
:description "Bindings for the IPFS HTTP API."
|
||||||
:depends-on (:drakma :yason :arnesi :uiop)
|
:depends-on (:alexandria :drakma :yason :arnesi :uiop)
|
||||||
:components ((:file "package")
|
:components ((:file "package")
|
||||||
(:file "main")))
|
(:file "main")))
|
||||||
|
|
47
main.lisp
47
main.lisp
|
@ -32,7 +32,9 @@
|
||||||
(let ((result
|
(let ((result
|
||||||
(multiple-value-list
|
(multiple-value-list
|
||||||
(drakma:http-request
|
(drakma:http-request
|
||||||
(make-call-url call arguments)
|
;; We ensure the string is of 'character elements and not 'base-char
|
||||||
|
;; which would break Puri.
|
||||||
|
(alexandria:copy-array (make-call-url call arguments) :element-type 'character)
|
||||||
:method method
|
:method method
|
||||||
:url-encoder #'ipfs::url-encode
|
:url-encoder #'ipfs::url-encode
|
||||||
:parameters parameters
|
:parameters parameters
|
||||||
|
@ -46,8 +48,10 @@
|
||||||
(let* ((result (cond ((stringp body) body)
|
(let* ((result (cond ((stringp body) body)
|
||||||
((vectorp body) (flexi-streams:octets-to-string body))))
|
((vectorp body) (flexi-streams:octets-to-string body))))
|
||||||
(result (if (search "application/json" (cdr (assoc :content-type headers)))
|
(result (if (search "application/json" (cdr (assoc :content-type headers)))
|
||||||
(unless (empty-string-p result)
|
(mapcar (lambda (line)
|
||||||
(simplify (yason:parse result :object-as :alist)))
|
(simplify (yason:parse line :object-as :alist)))
|
||||||
|
(delete "" (uiop:split-string result :separator (string #\newline))
|
||||||
|
:test 'string=))
|
||||||
result)))
|
result)))
|
||||||
(if (eql 200 status-code)
|
(if (eql 200 status-code)
|
||||||
result
|
result
|
||||||
|
@ -83,12 +87,39 @@
|
||||||
;; —————————————————————————————————————
|
;; —————————————————————————————————————
|
||||||
;; ROOT CALLS
|
;; ROOT CALLS
|
||||||
|
|
||||||
|
(defun parent-directory (path)
|
||||||
|
(if (uiop:directory-pathname-p path)
|
||||||
|
(uiop:pathname-parent-directory-pathname path)
|
||||||
|
(uiop:pathname-directory-pathname path)))
|
||||||
|
|
||||||
|
(defun directory->parameters (dir)
|
||||||
|
(let* ((result '())
|
||||||
|
(root (uiop:ensure-pathname dir :truenamize t))
|
||||||
|
(parent (parent-directory root)))
|
||||||
|
(uiop:collect-sub*directories
|
||||||
|
root
|
||||||
|
#'uiop:directory-exists-p
|
||||||
|
(constantly t)
|
||||||
|
(lambda (subdirectory)
|
||||||
|
(setf result
|
||||||
|
(cons `("file" ,subdirectory
|
||||||
|
:content-type "application/x-directory"
|
||||||
|
:filename ,(uiop:native-namestring (uiop:enough-pathname subdirectory parent)))
|
||||||
|
(append result
|
||||||
|
(mapcar (lambda (file)
|
||||||
|
`("file" ,file
|
||||||
|
:filename ,(uiop:native-namestring (uiop:enough-pathname file parent))))
|
||||||
|
(uiop:directory-files subdirectory)))))))
|
||||||
|
result))
|
||||||
|
|
||||||
;; PATHNAME → (HASH-STRING SIZE-NUMBER) || (NIL STRING)
|
;; PATHNAME → (HASH-STRING SIZE-NUMBER) || (NIL STRING)
|
||||||
(defun add (pathname &key (pin 't) (only-hash nil) (cid-version 0))
|
(defun add (pathname &key (pin 't) (only-hash nil) (cid-version 0))
|
||||||
"Add a file to IPFS, return it's hash.
|
"Add a file to IPFS, return it's hash.
|
||||||
/ipns/docs.ipfs.io/reference/api/http/#api-v0-add"
|
/ipns/docs.ipfs.io/reference/api/http/#api-v0-add"
|
||||||
(ipfs-call "add" `(("pin" ,pin) ("only-hash" ,only-hash) ("cid-version" ,cid-version))
|
(ipfs-call "add" `(("pin" ,pin) ("only-hash" ,only-hash) ("cid-version" ,cid-version))
|
||||||
:parameters `(("file" . ,pathname))))
|
:parameters (if (uiop:directory-exists-p pathname)
|
||||||
|
(directory->parameters pathname)
|
||||||
|
`(("file" . ,pathname)))))
|
||||||
|
|
||||||
;; STRING :NUMBER :NUMBER → STRING || (NIL STRING)
|
;; STRING :NUMBER :NUMBER → STRING || (NIL STRING)
|
||||||
(defun cat (ipfs-path &key (offset nil) (length nil))
|
(defun cat (ipfs-path &key (offset nil) (length nil))
|
||||||
|
@ -462,7 +493,7 @@
|
||||||
(defun files-ls (&optional (path "/"))
|
(defun files-ls (&optional (path "/"))
|
||||||
"List directories in local mutable namespace.
|
"List directories in local mutable namespace.
|
||||||
/ipns/docs.ipfs.io/reference/api/http/#api-v0-files-ls"
|
/ipns/docs.ipfs.io/reference/api/http/#api-v0-files-ls"
|
||||||
(ipfs-call "files/ls" `(("arg" ,path))))
|
(ipfs-call "files/ls" `(("arg" ,path) ("long" "true"))))
|
||||||
|
|
||||||
;; STRING [:BOOLEAN :NUMBER :STRING] → NIL || (NIL STRING)
|
;; STRING [:BOOLEAN :NUMBER :STRING] → NIL || (NIL STRING)
|
||||||
(defun files-mkdir (path &key (parents nil) (cid-version nil) (hash nil))
|
(defun files-mkdir (path &key (parents nil) (cid-version nil) (hash nil))
|
||||||
|
@ -496,8 +527,8 @@
|
||||||
|
|
||||||
;; STRING → ALIST || (NIL STRING)
|
;; STRING → ALIST || (NIL STRING)
|
||||||
(defun files-stat (path)
|
(defun files-stat (path)
|
||||||
"Get file status.
|
"Remove a given file.
|
||||||
/ipns/docs.ipfs.io/reference/api/http/#api-v0-files-stat"
|
/ipns/docs.ipfs.io/reference/api/http/#api-v0-files-rm"
|
||||||
(ipfs-call "files/stat" `(("arg" ,path))))
|
(ipfs-call "files/stat" `(("arg" ,path))))
|
||||||
|
|
||||||
;; PATHNAME STRING [:NUMBER :BOOLEAN :BOOLEAN :BOOLEAN :NUMBER :BOOLEAN
|
;; PATHNAME STRING [:NUMBER :BOOLEAN :BOOLEAN :BOOLEAN :NUMBER :BOOLEAN
|
||||||
|
@ -1102,5 +1133,5 @@ will be passed directly to the files-write function."
|
||||||
(cl-ppcre:regex-replace-all
|
(cl-ppcre:regex-replace-all
|
||||||
"%2520" (drakma:url-encode
|
"%2520" (drakma:url-encode
|
||||||
(cl-ppcre:regex-replace-all " " string "%20")
|
(cl-ppcre:regex-replace-all " " string "%20")
|
||||||
:utf-8)
|
drakma:*drakma-default-external-format*)
|
||||||
"%20"))
|
"%20"))
|
||||||
|
|
Ŝarĝante…
Reference in New Issue