! Copyright (C) 2008 Slava Pestov
! See http://factorcode.org/license.txt for BSD license.
USING: html.elements http.server.validators accessors namespaces
kernel io math.parser assocs classes words classes.tuple arrays
sequences io.files http.server.templating.fhtml
http.server.actions splitting mirrors hashtables fry
continuations math ;
IN: http.server.components
SYMBOL: components
TUPLE: component id required default ;
: component ( name -- component )
dup components get at
[ ] [ "No such component: " prepend throw ] ?if ;
GENERIC: validate* ( value component -- result )
GENERIC: render-view* ( value component -- )
GENERIC: render-edit* ( value component -- )
GENERIC: render-error* ( reason value component -- )
SYMBOL: values
: value values get at ;
: set-value values get set-at ;
: validate ( value component -- result )
'[
,
over empty? [
[ default>> [ v-default ] when* ]
[ required>> [ v-required ] when ]
bi
] [ validate* ] if
] with-validator ;
: render-view ( component -- )
[ id>> value ] [ render-view* ] bi ;
: render-error ( error -- )
write ;
: render-edit ( component -- )
dup id>> value dup validation-error? [
[ reason>> ] [ value>> ] bi rot render-error*
] [
swap [ default>> or ] keep render-edit*
] if ;
: ( id class -- component )
\ component construct-empty
swap construct-delegate
swap >>id ; inline
! Forms
TUPLE: form view-template edit-template components ;
: