summaryrefslogtreecommitdiff
path: root/tutorial
diff options
context:
space:
mode:
authorMax-Gerd Retzlaff <m.retzlaff@gmx.net>2022-08-23 17:38:34 +0200
committerJens Geyer <jensg@apache.org>2022-08-30 23:58:57 +0200
commit04057ac28a72ad4001def05a7bc8e13cc640b5ca (patch)
tree44435ef2391b86828f97736cfdecc4e374782404 /tutorial
parent39fa1854a75e96235e2f50a45546b874da29e756 (diff)
downloadthrift-04057ac28a72ad4001def05a7bc8e13cc640b5ca.tar.gz
Revert "THRIFT-5501 Remove Common Lisp support"
This reverts commit d88d4f93b3390989bd47a43f3941ca7d576750f6.
Diffstat (limited to 'tutorial')
-rw-r--r--tutorial/Makefile.am4
-rwxr-xr-xtutorial/cl/Makefile.am66
-rw-r--r--tutorial/cl/load-locally.lisp22
-rw-r--r--tutorial/cl/make-tutorial-client.lisp51
-rw-r--r--tutorial/cl/make-tutorial-server.lisp29
-rw-r--r--tutorial/cl/shared-implementation.lisp25
-rw-r--r--tutorial/cl/thrift-tutorial.asd17
-rw-r--r--tutorial/cl/tutorial-implementation.lisp41
8 files changed, 255 insertions, 0 deletions
diff --git a/tutorial/Makefile.am b/tutorial/Makefile.am
index 77e8593ea..ba445e0db 100644
--- a/tutorial/Makefile.am
+++ b/tutorial/Makefile.am
@@ -74,6 +74,10 @@ if WITH_RS
SUBDIRS += rs
endif
+if WITH_CL
+SUBDIRS += cl
+endif
+
if WITH_PERL
SUBDIRS += perl
endif
diff --git a/tutorial/cl/Makefile.am b/tutorial/cl/Makefile.am
new file mode 100755
index 000000000..70c5e0730
--- /dev/null
+++ b/tutorial/cl/Makefile.am
@@ -0,0 +1,66 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+setup-local-lisp-env: ../../lib/cl/ensure-externals.sh
+ bash ../../lib/cl/ensure-externals.sh
+
+gen-cl: $(top_srcdir)/tutorial/tutorial.thrift
+ $(THRIFT) --gen cl -r $<
+
+ALL_FILE_PREREQS = \
+ load-locally.lisp \
+ make-tutorial-server.lisp \
+ make-tutorial-client.lisp \
+ shared-implementation.lisp \
+ thrift-tutorial.asd \
+ tutorial-implementation.lisp
+
+# NOTE: the server and client cannot be built in parallel
+# because on loading the make-tutorial-* scripts SBCL will
+# attempt to compile their dependencies. Unfortunately,
+# because their dependencies are shared, parallel jobs can
+# end up overwriting or corrupting the compiled files
+all-local: gen-cl setup-local-lisp-env $(ALL_FILE_PREREQS)
+ $(SBCL) --script make-tutorial-server.lisp
+ $(SBCL) --script make-tutorial-client.lisp
+
+tutorialserver: all
+ ./TutorialServer
+
+tutorialclient: all
+ ./TutorialClient
+
+clean-local:
+ -$(RM) -r gen-*
+ -$(RM) -r externals
+ -$(RM) -r quicklisp
+ -$(RM) -r lib
+ -$(RM) quicklisp.lisp
+ -$(RM) backport-update.zip
+ -$(RM) shared-implementation.fasl
+ -$(RM) tutorial-implementation.fasl
+ -$(RM) TutorialServer
+ -$(RM) TutorialClient
+
+EXTRA_DIST = \
+ tutorial-implementation.lisp \
+ shared-implementation.lisp \
+ thrift-tutorial.asd \
+ make-tutorial-server.lisp \
+ make-tutorial-client.lisp \
+ load-locally.lisp
diff --git a/tutorial/cl/load-locally.lisp b/tutorial/cl/load-locally.lisp
new file mode 100644
index 000000000..b52a0a269
--- /dev/null
+++ b/tutorial/cl/load-locally.lisp
@@ -0,0 +1,22 @@
+(in-package #:cl-user)
+
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+;;;; Just a script for loading the library itself, using bundled dependencies.
+;;;; This is an identical copy of the file in lib/cl.
+
+(require "asdf")
+
+(load (merge-pathnames "externals/bundle.lisp" *load-truename*))
+(asdf:load-asd (merge-pathnames "lib/de.setf.thrift-backport-update/thrift.asd" *load-truename*))
+(asdf:load-system :thrift)
diff --git a/tutorial/cl/make-tutorial-client.lisp b/tutorial/cl/make-tutorial-client.lisp
new file mode 100644
index 000000000..3a6d86134
--- /dev/null
+++ b/tutorial/cl/make-tutorial-client.lisp
@@ -0,0 +1,51 @@
+(in-package #:cl-user)
+
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+(require "asdf")
+(load (merge-pathnames "load-locally.lisp" *load-truename*))
+(asdf:load-system :net.didierverna.clon)
+(asdf:load-asd (merge-pathnames "gen-cl/shared/thrift-gen-shared.asd" *load-truename*))
+(asdf:load-asd (merge-pathnames "gen-cl/tutorial/thrift-gen-tutorial.asd" *load-truename*))
+(asdf:load-asd (merge-pathnames "thrift-tutorial.asd" *load-truename*))
+(asdf:load-system :thrift-tutorial)
+
+(net.didierverna.clon:nickname-package)
+
+(defun main ()
+ "Entry point for the binary."
+ (thrift:with-client (prot #u"thrift://127.0.0.1:9090")
+ (tutorial.calculator:ping prot)
+ (format t "ping()~%")
+ (format t "1 + 1 = ~a~%" (tutorial.calculator:add prot 1 1))
+ (let ((work-instance (tutorial:make-work :num1 5
+ :num2 0
+ :op tutorial:operation.divide
+ :comment "Booya!")))
+ (handler-case (format t
+ "5 / 0 = ~a - Oh, really? An exception should have been thrown here.~%"
+ (tutorial.calculator:calculate prot 1 work-instance))
+ (tutorial:invalidoperation (e)
+ (format t "---~%(Expected) Invalid Operation caught: ~%~a~%---~%" e))))
+ (let ((work-instance (tutorial:make-work :num1 15
+ :num2 10
+ :op tutorial:operation.subtract
+ :comment "Playing nice this time.")))
+ (handler-case (format t
+ "15 - 10 = ~a~%"
+ (tutorial.calculator:calculate prot 1 work-instance))
+ (tutorial:invalidoperation (e)
+ (format t "---~%(Unexpected) Invalid Operation caught: ~%~a~%---~%" e))))
+ (format t "Check log: ~a~%" (shared.shared-service:get-struct prot 1))))
+
+(clon:dump "TutorialClient" main)
diff --git a/tutorial/cl/make-tutorial-server.lisp b/tutorial/cl/make-tutorial-server.lisp
new file mode 100644
index 000000000..4cf1a9026
--- /dev/null
+++ b/tutorial/cl/make-tutorial-server.lisp
@@ -0,0 +1,29 @@
+(in-package #:cl-user)
+
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+(require "asdf")
+(load (merge-pathnames "load-locally.lisp" *load-truename*))
+(asdf:load-system :net.didierverna.clon)
+(asdf:load-asd (merge-pathnames "gen-cl/shared/thrift-gen-shared.asd" *load-truename*))
+(asdf:load-asd (merge-pathnames "gen-cl/tutorial/thrift-gen-tutorial.asd" *load-truename*))
+(asdf:load-asd (merge-pathnames "thrift-tutorial.asd" *load-truename*))
+(asdf:load-system :thrift-tutorial)
+
+(net.didierverna.clon:nickname-package)
+
+(defun main ()
+ "Entry point for the binary."
+ (thrift:serve #u"thrift://127.0.0.1:9090" tutorial:calculator))
+
+(clon:dump "TutorialServer" main)
diff --git a/tutorial/cl/shared-implementation.lisp b/tutorial/cl/shared-implementation.lisp
new file mode 100644
index 000000000..c197626a5
--- /dev/null
+++ b/tutorial/cl/shared-implementation.lisp
@@ -0,0 +1,25 @@
+(in-package #:shared-implementation)
+
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+(defvar *structs* (make-hash-table))
+
+(defun shared.shared-service-implementation:get-struct (key)
+ (format t "getStruct(~a)~%" key)
+ (gethash key *structs*))
+
+(defun add-log (key value)
+ (setf (gethash key *structs*)
+ (make-instance 'shared:sharedstruct
+ :key key
+ :value (write-to-string value))))
diff --git a/tutorial/cl/thrift-tutorial.asd b/tutorial/cl/thrift-tutorial.asd
new file mode 100644
index 000000000..8a0353763
--- /dev/null
+++ b/tutorial/cl/thrift-tutorial.asd
@@ -0,0 +1,17 @@
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+(asdf:defsystem #:thrift-tutorial
+ :depends-on (#:thrift-gen-tutorial)
+ :serial t
+ :components ((:file "shared-implementation")
+ (:file "tutorial-implementation")))
diff --git a/tutorial/cl/tutorial-implementation.lisp b/tutorial/cl/tutorial-implementation.lisp
new file mode 100644
index 000000000..5c92fe405
--- /dev/null
+++ b/tutorial/cl/tutorial-implementation.lisp
@@ -0,0 +1,41 @@
+(in-package #:tutorial-implementation)
+
+;;;; Licensed under the Apache License, Version 2.0 (the "License");
+;;;; you may not use this file except in compliance with the License.
+;;;; You may obtain a copy of the License at
+;;;;
+;;;; http://www.apache.org/licenses/LICENSE-2.0
+;;;;
+;;;; Unless required by applicable law or agreed to in writing, software
+;;;; distributed under the License is distributed on an "AS IS" BASIS,
+;;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+;;;; See the License for the specific language governing permissions and
+;;;; limitations under the License.
+
+(defun tutorial.calculator-implementation:ping ()
+ (format t "ping()~%"))
+
+(defun tutorial.calculator-implementation:add (num1 num2)
+ (format t "add(~a, ~a)~%" num1 num2)
+ (+ num1 num2))
+
+(defun tutorial.calculator-implementation:calculate (logid work)
+ (format t "calculate(~a, ~a)~%" logid work)
+ (handler-case
+ (let* ((num1 (tutorial:work-num1 work))
+ (num2 (tutorial:work-num2 work))
+ (op (tutorial:work-op work))
+ (result
+ (cond
+ ((= op tutorial:operation.add) (+ num1 num2))
+ ((= op tutorial:operation.subtract) (- num1 num2))
+ ((= op tutorial:operation.multiply) (* num1 num2))
+ ((= op tutorial:operation.divide) (/ num1 num2)))))
+ (shared-implementation::add-log logid result)
+ result)
+ (division-by-zero () (error 'tutorial:invalidoperation
+ :why "Division by zero."
+ :what-op (tutorial:work-op work)))))
+
+(defun tutorial.calculator-implementation:zip ()
+ (format t "zip()~%"))