ambrevar/file: Create `file' class.

master
Pierre Neidhardt 2021-01-14 22:34:21 +01:00
parent df767832f1
commit 7862e4b76a
2 changed files with 62 additions and 0 deletions

View File

@ -41,6 +41,7 @@
(:use-reexport
#:ambrevar/debug
#:ambrevar/emacs
#:ambrevar/file
#:ambrevar/guix
#:ambrevar/shell
#:ambrevar/syspack

View File

@ -0,0 +1,61 @@
(uiop:define-package #:ambrevar/file
(:documentation "File class.")
(:use #:common-lisp)
(:use #:trivia)
(:import-from #:hu.dwim.defclass-star #:defclass*)
(:import-from #:serapeum #:export-always))
(in-package #:ambrevar/file)
(defun name-identity (name definition)
(declare (ignore definition))
name)
(defclass* file ()
((path (error "Path required")
:type string)
(inode 0)
(link-count 0)
(kind :regular-file ; "kind" because `type' is reserved by CL.
:type (member :directory
:character-device
:block-device
:regular-file
:symbolic-link
:socket
:pipe))
(size 0)
(user-id 0)
(group-id 0)
;; TODO: Include blocks?
(creation-date (local-time:unix-to-timestamp 0))
(modification-date (local-time:unix-to-timestamp 0))
(access-date (local-time:unix-to-timestamp 0))
(permissions '()
:type (or null
(cons #.(cons 'member (mapcar #'first osicat::+permissions+))))))
(:accessor-name-transformer #'name-identity))
;; TODO: Customize `print-object'.
(defun file (path)
(let ((native-path (uiop:truename* (uiop:parse-native-namestring path))))
(assert (uiop:file-exists-p native-path))
(let ((stat (osicat-posix:stat native-path)))
;; From Osicat's `file-permissions':
(flet ((stat-permissions (stat)
(let ((mode (osicat-posix:stat-mode stat)))
(loop for (name . value) in osicat::+permissions+
when (plusp (logand mode value))
collect name))))
(make-instance 'file
:path (uiop:unix-namestring native-path)
:inode (osicat-posix:stat-ino stat)
:link-count (osicat-posix:stat-nlink stat)
:kind (osicat:file-kind native-path) ; TODO: Don't recall `stat'.
:size (osicat-posix:stat-size stat)
:user-id (osicat-posix:stat-uid stat)
:group-id (osicat-posix:stat-gid stat)
:creation-date (local-time:unix-to-timestamp (osicat-posix:stat-ctime stat))
:modification-date (local-time:unix-to-timestamp (osicat-posix:stat-mtime stat))
:access-date (local-time:unix-to-timestamp (osicat-posix:stat-atime stat))
:permissions (stat-permissions stat))))))