42 lines
		
	
	
		
			981 B
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			981 B
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2009 Bruno Deferrari
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: combinators io kernel math math.parser sequences ;
 | 
						|
IN: redis.response-parser
 | 
						|
 | 
						|
DEFER: read-response
 | 
						|
 | 
						|
TUPLE: redis-response message ;
 | 
						|
ERROR: redis-error message ;
 | 
						|
 | 
						|
: <redis-response> ( message -- redis-response )
 | 
						|
    redis-response boa ;
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: read-bulk ( n -- bytes )
 | 
						|
    dup 0 < [ drop f ] [ read 2 read drop ] if ;
 | 
						|
: read-multi-bulk ( n -- seq/f )
 | 
						|
    dup 0 <
 | 
						|
    [ drop f ]
 | 
						|
    [ [ read-response ] replicate ] if ;
 | 
						|
 | 
						|
: handle-response ( string -- string )
 | 
						|
    <redis-response> ;
 | 
						|
 | 
						|
: handle-error ( string -- * )
 | 
						|
    redis-error ;
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: read-response ( -- response )
 | 
						|
    readln unclip {
 | 
						|
        { CHAR: : [ string>number ] }
 | 
						|
        { CHAR: + [ handle-response ] }
 | 
						|
        { CHAR: $ [ string>number read-bulk ] }
 | 
						|
        { CHAR: * [ string>number read-multi-bulk ] }
 | 
						|
        { CHAR: - [ handle-error ] }
 | 
						|
    } case ;
 | 
						|
 | 
						|
: check-response ( -- )
 | 
						|
    read-response drop ;
 |