1 ! Copyright (C) 2008 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: parser-combinators memoize kernel sequences
\r
4 logging arrays words strings vectors io io.files
\r
5 namespaces combinators combinators.lib logging.server
\r
6 calendar calendar.format ;
\r
9 : string-of ( quot -- parser ) satisfy <!*> [ >string ] <@ ;
\r
13 : 'date' ( -- parser )
\r
14 [ "]" member? not ] string-of [
\r
15 dup multiline-header =
\r
16 [ drop multiline ] [ rfc3339>timestamp ] if
\r
18 "[" "]" surrounded-by ;
\r
20 : 'log-level' ( -- parser )
\r
22 [ word-name token ] keep [ nip ] curry <@
\r
25 : 'word-name' ( -- parser )
\r
26 [ " :" member? not ] string-of ;
\r
30 : 'malformed-line' ( -- parser )
\r
31 [ drop t ] string-of [ malformed swap 2array ] <@ ;
\r
33 : 'log-message' ( -- parser )
\r
34 [ drop t ] string-of [ 1vector ] <@ ;
\r
36 MEMO: 'log-line' ( -- parser )
\r
38 'log-level' " " token <& <&>
\r
39 'word-name' ": " token <& <:&>
\r
41 'malformed-line' <|> ;
\r
43 : parse-log-line ( string -- entry )
\r
44 'log-line' parse-1 ;
\r
46 : malformed? ( line -- ? )
\r
47 first malformed eq? ;
\r
49 : multiline? ( line -- ? )
\r
50 first multiline eq? ;
\r
52 : malformed-line ( line -- )
\r
53 "Warning: malformed log line:" print
\r
56 : add-multiline ( line -- )
\r
57 building get empty? [
\r
58 "Warning: log begins with multiline entry" print drop
\r
60 fourth first building get peek fourth push
\r
63 : parse-log ( lines -- entries )
\r
67 { [ dup malformed? ] [ malformed-line ] }
\r
68 { [ dup multiline? ] [ add-multiline ] }
\r