parse cli arguments and call create project in main
This commit is contained in:
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
:author "Emre Akan"
|
:author "Emre Akan"
|
||||||
:description "Quickstart Common Lisp projects"
|
:description "Quickstart Common Lisp projects"
|
||||||
:license "GPL-3.0"
|
:license "GPL-3.0"
|
||||||
:version "0.0.2"
|
:version "0.0.3"
|
||||||
:depends-on ("uiop")
|
:depends-on ("uiop")
|
||||||
:pathname "src/"
|
:pathname "src/"
|
||||||
:serial t
|
:serial t
|
||||||
|
|||||||
+79
-1
@@ -4,5 +4,83 @@
|
|||||||
|
|
||||||
(in-package :lspack/exe)
|
(in-package :lspack/exe)
|
||||||
|
|
||||||
|
(defun string-starts-with (str substr)
|
||||||
|
(when (>= (length str) (length substr))
|
||||||
|
(string= str substr :end1 (length substr))))
|
||||||
|
|
||||||
|
(defclass <arguments> ()
|
||||||
|
((name :initform nil
|
||||||
|
:accessor name)
|
||||||
|
(root :initform nil
|
||||||
|
:accessor root)
|
||||||
|
(author :initform nil
|
||||||
|
:accessor author)
|
||||||
|
(license :initform nil
|
||||||
|
:accessor license)
|
||||||
|
(description :initform ""
|
||||||
|
:accessor description)))
|
||||||
|
|
||||||
|
(defun argument-key-p (arg)
|
||||||
|
(or (string-starts-with arg "-")
|
||||||
|
(string-starts-with arg "--")))
|
||||||
|
|
||||||
|
(defun parse-keyword (args acc)
|
||||||
|
(destructuring-bind (key val . rest) args
|
||||||
|
(if (or (null val) (null key))
|
||||||
|
acc
|
||||||
|
(progn
|
||||||
|
(cond ((or (string= key "-r")
|
||||||
|
(string= key "--root"))
|
||||||
|
(setf (slot-value acc 'root) val))
|
||||||
|
((or (string= key "-a")
|
||||||
|
(string= key "--author"))
|
||||||
|
(setf (slot-value acc 'author) val))
|
||||||
|
((or (string= key "-l")
|
||||||
|
(string= key "--license"))
|
||||||
|
(setf (slot-value acc 'license) val))
|
||||||
|
((or (string= key "-d")
|
||||||
|
(string= key "--description"))
|
||||||
|
(setf (slot-value acc 'description) val)))
|
||||||
|
(parse-keyword-arguments rest acc)))))
|
||||||
|
|
||||||
|
(defun parse-keyword-arguments (args acc)
|
||||||
|
(let ((arg (car args)))
|
||||||
|
(cond ((null arg) acc)
|
||||||
|
((argument-key-p arg) (parse-keyword args acc))
|
||||||
|
(t ))))
|
||||||
|
|
||||||
|
(defun parse-arguments-header (args acc)
|
||||||
|
(let ((arg (car args)))
|
||||||
|
(unless (or (null arg) (argument-key-p arg))
|
||||||
|
(setf (slot-value acc 'name) arg)
|
||||||
|
(parse-keyword-arguments (cdr args) acc))))
|
||||||
|
|
||||||
|
(defun parse-arguments (args)
|
||||||
|
(let ((acc (make-instance '<arguments>)))
|
||||||
|
(parse-arguments-header args acc)))
|
||||||
|
|
||||||
|
(defmethod create-project ((argument <arguments>))
|
||||||
|
(lspack:start (name argument) (root argument)
|
||||||
|
:license (license argument)
|
||||||
|
:description (description argument)
|
||||||
|
:author (author argument)))
|
||||||
|
|
||||||
|
(defmethod normalize-arguments ((argument <arguments>))
|
||||||
|
(setf (root argument)
|
||||||
|
(if (null (root argument))
|
||||||
|
(uiop:ensure-directory-pathname (name argument))
|
||||||
|
(uiop:ensure-directory-pathname (root argument))))
|
||||||
|
(when (null (author argument))
|
||||||
|
(setf (author argument) lspack:*default-author*))
|
||||||
|
(let ((license (license argument)))
|
||||||
|
(setf (license argument)
|
||||||
|
(cond ((null license) lspack:*default-license*)
|
||||||
|
((stringp license) (intern (string-upcase license) :keyword))
|
||||||
|
(t lspack:*default-license*))))
|
||||||
|
argument)
|
||||||
|
|
||||||
(defun main ()
|
(defun main ()
|
||||||
(format t "Hello World!"))
|
(format t "cwd: ~S~%" (uiop:getcwd))
|
||||||
|
(let ((args (parse-arguments (uiop:command-line-arguments))))
|
||||||
|
(normalize-arguments args)
|
||||||
|
(create-project args)))
|
||||||
|
|||||||
+3
-1
@@ -1,3 +1,5 @@
|
|||||||
(defpackage :lspack
|
(defpackage :lspack
|
||||||
(:use :cl)
|
(:use :cl)
|
||||||
(:export :start))
|
(:export #:start
|
||||||
|
#:*default-author*
|
||||||
|
#:*default-license*))
|
||||||
|
|||||||
+5
-5
@@ -61,12 +61,12 @@
|
|||||||
:if-exists :supersede
|
:if-exists :supersede
|
||||||
:if-does-not-exist :create)
|
:if-does-not-exist :create)
|
||||||
(project-defsystem-write project out))
|
(project-defsystem-write project out))
|
||||||
(format *error-output* "~&Created ~S" path)))
|
(format *error-output* "~&Created ~S~%" path)))
|
||||||
|
|
||||||
(defmethod project-ensure-root ((project <project>))
|
(defmethod project-ensure-root ((project <project>))
|
||||||
(with-slots (root) project
|
(with-slots (root) project
|
||||||
(ensure-directories-exist (uiop:physicalize-pathname root))
|
(ensure-directories-exist (uiop:physicalize-pathname root))
|
||||||
(format *error-output* "~&Starting project at ~S" root)))
|
(format *error-output* "~&Starting project at ~S~%" root)))
|
||||||
|
|
||||||
(defmethod project-source-pathname ((project <project>))
|
(defmethod project-source-pathname ((project <project>))
|
||||||
(uiop:merge-pathnames* (uiop:ensure-directory-pathname (project-pathname project))
|
(uiop:merge-pathnames* (uiop:ensure-directory-pathname (project-pathname project))
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
(format *error-output* "~&Source directory: ~S" src)
|
(format *error-output* "~&Source directory: ~S" src)
|
||||||
(unless (string= pathname "")
|
(unless (string= pathname "")
|
||||||
(ensure-directories-exist (uiop:physicalize-pathname src))
|
(ensure-directories-exist (uiop:physicalize-pathname src))
|
||||||
(format *error-output* " created.")))))
|
(format *error-output* " created.~%")))))
|
||||||
|
|
||||||
(defmethod project-write-notice ((project <project>) stream)
|
(defmethod project-write-notice ((project <project>) stream)
|
||||||
(uiop:if-let ((notice (get-notice (project-license project))))
|
(uiop:if-let ((notice (get-notice (project-license project))))
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
:if-does-not-exist :create)
|
:if-does-not-exist :create)
|
||||||
(project-write-notice project out)
|
(project-write-notice project out)
|
||||||
(format out "~&(defpackage :~a~% (:use :cl))~%" name))
|
(format out "~&(defpackage :~a~% (:use :cl))~%" name))
|
||||||
(format *error-output* "~&Created ~S" path))))
|
(format *error-output* "~&Created ~S~%" path))))
|
||||||
|
|
||||||
(defmethod project-license-create ((project <project>))
|
(defmethod project-license-create ((project <project>))
|
||||||
(let ((license (get-license (project-license project))))
|
(let ((license (get-license (project-license project))))
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
:if-exists :supersede
|
:if-exists :supersede
|
||||||
:if-does-not-exist :create)
|
:if-does-not-exist :create)
|
||||||
(funcall writer project out))
|
(funcall writer project out))
|
||||||
(format *error-output* "~&Created ~S" license-file))))))
|
(format *error-output* "~&Created ~S~%" license-file))))))
|
||||||
|
|
||||||
(defmethod project-start ((project <project>))
|
(defmethod project-start ((project <project>))
|
||||||
(project-ensure-root project)
|
(project-ensure-root project)
|
||||||
|
|||||||
Reference in New Issue
Block a user