REBOL [
Title: "REBOL/Services Client Test Shell"
Version: 1.0.1
Author: "Gabriele Santilli"
File: %shell.r
]
lns-url: http://www.rebol.net/cgi-bin/services.r
lns-port: none
print [system/script/header/title system/script/header/version]
do http://www.rebol.net/rebservices/client.r
ctx-services/debug-enable: false
print "Type HELP for more information."
help-menu: {
Local Commands:
QUIT - Quit the shell
LOGIN [user [pass]] - Login as user
LOGOUT - Logout
HELP - This help message
RESET - Reset connection
LOCAL expr - Evaluate expression locally
Useful Remote Commands:
INFO - General info about services
COMMANDS - Discovery of services commands
DATE - Date/time/zone of server
SYSTEM - REBOL version
LANGUAGE - Human interface language
Any other command is sent to the server, along with arguments. For example:
ECHO "How ya doing?"
ECHO [%file $10.00 http://www.rebol.com]
INFO all
INFO title
}
if-error:
func [
"Tries to DO code, then DOes on-error if it fails" [throw]
code [block!]
on-error [block!] "The word 'error will refer to the error"
/local result
] [
on-error: func [[throw] error [error!]] on-error
either error? set/any 'result try code [on-error :result] [get/any 'result]
]
form-error:
func [
"Forms an error message"
errobj [object!] "Disarmed error"
/all "Use the same format as the REBOL console"
/local errtype text
] [
errtype: get in system/error get in errobj 'type
text: get in errtype get in errobj 'id
if block? text [text: reform bind/copy text in errobj 'self]
either all [
rejoin [
"** " get in errtype 'type ": " text newline
either get in errobj 'where [join "** Where: " [mold get in errobj 'where newline]] [""]
either get in errobj 'near [join "** Near: " [mold/only get in errobj 'near newline]] [""]
]
] [
text
]
]
lns-port: open-service lns-url
do-local:
func [cmd] [
bind cmd system/words
set/any 'cmd if-error cmd [
prin form-error/all disarm error
exit
]
if value? 'cmd [print ["L===" mold cmd]]
]
forever [
request: to block! ask "LNS> "
if not parse request [
['q | 'quit] (quit)
|
'login set user opt string! set pass opt string! (
user: any [user ask "Username? "]
pass: any [pass ask/hide "Password? "]
if not login-service lns-port user pass [
print "***Unable to log in!"
]
)
|
'logout (logout-service lns-port)
|
'reset (attempt [close-service lns-port lns-port: open-service lns-url])
|
['! | 'local] copy cmd to end (do-local cmd)
|
'help (print help-menu)
|
end ; empty command line, ignore
] [
if-error [
result: do-service lns-port request
either all [result/1 = 'done result/3 = 'ok] [
print ["====" mold/only next result/4]
] [
print ["!!!!" mold result]
]
] [
prin form-error/all disarm error
]
]
]