summaryrefslogtreecommitdiff
path: root/www/build-site.el
diff options
context:
space:
mode:
authorMarek Paśnikowski <marek@marekpasnikowski.pl>2024-01-21 00:34:21 +0100
committerMarek Paśnikowski <marek@marekpasnikowski.pl>2024-01-21 00:34:21 +0100
commit33182646943245b1e41d8dfc73dc620811ff342c (patch)
treee249f71ed9a8ebb862beaef80f42f625ad7f400c /www/build-site.el
parente0cffe169199f745ae269fb294912dc95d0318d9 (diff)
Implement input sanitationmuseum-first-oop-elisp
To the best of my current ability, implement checks and guards on the given inputs.
Diffstat (limited to 'www/build-site.el')
-rw-r--r--www/build-site.el66
1 files changed, 51 insertions, 15 deletions
diff --git a/www/build-site.el b/www/build-site.el
index 92f6339..5f2e997 100644
--- a/www/build-site.el
+++ b/www/build-site.el
@@ -10,45 +10,81 @@
:object-compose
( lambda ( )
- ( setq org-publish-project-alist ( list object-projects ) )
- ( ) )
+ ( setq org-publish-project-alist ( list object-projects ) ) )
:object-get-projects
- ( lambda ( data-projects )
- ( setq object-projects ( append data-projects object-projects ) )
- ( ) )
+ ( lambda ( project-data )
+ ( setq object-projects ( append project-data object-projects ) ) )
:object-report
( lambda ( )
( print org-publish-project-alist )
- ( print success-report )
- ( ) ) ) ) )
+ ( print success-report ) ) ) ) )
;;; The Object Interface
( defun object-compose ( publication-instance )
( funcall ( plist-get publication-instance :object-compose ) ) )
-( defun object-get-projects ( publication-instance data-projects )
+( defun object-get-projects ( publication-instance project-data )
( funcall
- ( plist-get publication-instance :object-get-projects ) data-projects ) )
+ ( plist-get publication-instance :object-get-projects ) project-data ) )
( defun object-report ( publication-instance )
( funcall ( plist-get publication-instance :object-report ) ) )
;;; The User Logic
+( defun atypical-header-p ( project-data )
+ ( let ( ( element-1 ( pop project-data ) )
+ ( element-2 ( pop project-data ) )
+ ( error-1 "First element is not a string: " )
+ ( error-2 "Second element is not a keyword: " ) )
+ ( condition-case error
+ ( cond
+ ( ( not ( stringp element-1 ) )
+ ( signal 'scan-error ( concat error-1 element-1 ) ) )
+ ( ( not ( keywordp element-2 ) )
+ ( signal 'scan-error ( concat error-2 element-2 ) ) ) )
+ ( scan-error ( print ( cdr error ) ) ) ) ) )
+
( defun export-project-alist ( publication-instance )
( object-compose publication-instance )
( object-report publication-instance ) )
+( defun get-component ( project-data )
+ ( let ( ( component ( nth 2 project-data ) ) )
+ ( print component )
+ component ) )
+
+( defun has-component-p ( project-data )
+ ( let ( ( component-keyword ':components )
+ ( second ( nth 1 project-data ) ) )
+ ( eq component-keyword second ) ) )
+
( defun import-data ( publication-instance project-data )
- ( let ( ( data-projects ( plist-get project-data :data-projects ) ) )
- ( object-get-projects publication-instance data-projects ) ) )
+ ( object-get-projects publication-instance project-data ) )
+
+( defun too-short-p ( project-data )
+ ( let ( ( minimal-length 2 ) )
+ ( < ( length project-data ) minimal-length ) ) )
;;; The User Interface
-( defun publish ( publication-instance &rest project-data )
- ( import-data publication-instance project-data )
- ( export-project-alist publication-instance )
- ( ) )
+( defun publish ( publication-instance &rest project-data-wrapped )
+ ( let ( ( project-data ( car project-data-wrapped ) ) )
+ ( pcase project-data
+ ( ( guard ( too-short-p project-data ) ) nil )
+ ( ( guard ( atypical-header-p project-data ) nil ) )
+ ( ( pred has-component-p project-data )
+ ( let ( ( component ( get-component project-data ) )
+ ( head ( nth 0 project-data ) )
+ ( tail ( nthcdr 3 project-data ) ) )
+ ( list
+ head
+ ( publish publication-instance component )
+ ( publish publication-instance tail ) ) ) )
+ ( _
+ ( progn
+ ( import-data publication-instance project-data )
+ ( export-project-alist publication-instance ) ) ) ) ) )