[Fencommits] fenserve: make board example load the graph from storm if it's there
Benja Fallenstein
benja.fallenstein at gmail.com
Thu Mar 22 19:49:10 EET 2007
Thu Mar 22 02:20:58 EET 2007 Benja Fallenstein <benja.fallenstein at gmail.com>
* make board example load the graph from storm if it's there
diff -rN -u old-fenserve/FenServe.hs new-fenserve/FenServe.hs
--- old-fenserve/FenServe.hs 2007-03-22 19:49:10.000000000 +0200
+++ new-fenserve/FenServe.hs 2007-03-22 19:49:10.000000000 +0200
@@ -196,19 +196,22 @@
updateData f node = readData node >>= f >>= writeData (bURI $ bID node)
getURI :: [String] -> Request -> FenServe Result
-getURI path req = do dir <- get; getURI' path dir where
- getURI' [x] dir = readData dir >>= f . dirEntries where
- f (FileEntry n r : _ ) | n == x = getBlock (bID r) >>= return .
- mkResult 200 "text/html"
- f (ExecutableEntry n c : _ ) | n == x = execute c req
- f (_ : es) = f es
- f [] = return $ mkResult 404 "text/html" $
- toUTF $ "not found: " ++ x
- getURI' (x:xs) dir = readData dir >>= f . dirEntries where
- f (DirEntry n sub : _ ) | n == x = getURI' xs sub
+getURI path req = getEntry path >>= \entry -> case entry of
+ Left err -> return $ mkResult 404 "text/html" $ toUTF err
+ Right (FileEntry n r) -> do s <- getBlock (bID r)
+ return $ mkResult 200 "text/html" s
+ Right (ExecutableEntry n c) -> execute c req
+
+getEntry :: [String] -> FenServe (Either String Entry)
+getEntry path = do dir <- get; getEntry' path dir where
+ getEntry' [x] dir = readData dir >>= f . dirEntries where
+ f (e@(FileEntry n _) : _ ) | n == x = return $ Right e
+ f (e@(ExecutableEntry n _) : _ ) | n == x = return $ Right e
+ f [] = return $ Left $ "not found: " ++ x
+ getEntry' (x:xs) dir = readData dir >>= f . dirEntries where
+ f (DirEntry n sub : _ ) | n == x = getEntry' xs sub
f (_ : es) = f es
- f [] = return $ mkResult 404 "text/html" $
- toUTF $ "dir not found: " ++ x
+ f [] = return $ Left $ "dir not found: " ++ x
execute :: Node -> Request -> FenServe Result
execute code req = do
@@ -252,10 +255,12 @@
unBody (LargeBody _ _) = error "FenServe.unBody: large body not handled"
putURI :: [String] -> Request -> FenServe Result
-putURI path rq = do dir <- get; rid <- addBlock (unBody $ rqBody rq)
- putURI' path (bIRI rid) dir >>= put
- return $ mkResult 200 "text/html" (toUTF "Ok.\n") where
- putURI' [x] r dir = updateData f' dir where
+putURI path rq = addBlock (unBody $ rqBody rq) >>= putBlock path . bIRI
+
+putBlock :: [String] -> Node -> FenServe Result
+putBlock path r = do get >>= putBlock' path r >>= put
+ return $ mkResult 200 "text/html" (toUTF "Ok.\n") where
+ putBlock' [x] r dir = updateData f' dir where
f' (Dir n entries) = return $ Dir n (f entries)
f (FileEntry n _ : es) | n == x = FileEntry n r : es
| n ++ ".code" == x = ExecutableEntry n r : es
@@ -265,8 +270,8 @@
f [] | ".code" `List.isSuffixOf` x
= [ExecutableEntry (take (length x - 5) x) r]
| otherwise = [FileEntry x r]
- putURI' (x:xs) r dir = updateData f' dir where
- recurse sub = do sub' <- putURI' xs r sub; return [DirEntry x sub']
+ putBlock' (x:xs) r dir = updateData f' dir where
+ recurse sub = do sub' <- putBlock' xs r sub; return [DirEntry x sub']
f' (Dir n entries) = do es' <- f entries; return (Dir n es')
f (DirEntry n sub : es) | n == x = liftM (++es) (recurse sub)
f (e : es) = do es' <- f es; return (e:es')
diff -rN -u old-fenserve/board-demo.page new-fenserve/board-demo.page
--- old-fenserve/board-demo.page 2007-03-22 19:49:10.000000000 +0200
+++ new-fenserve/board-demo.page 2007-03-22 19:49:10.000000000 +0200
@@ -31,7 +31,7 @@
lit s = Literal s Plain
blog = IRI "ex:blog"; post = IRI "ex:post"
-example = toGraph (IRI "ex:graph") [
+example = toGraph (IRI "bah:graph") [
(blog, dc_title, lit "Benja's Blog"),
(blog, dc_description, lit "Benja Fallenstein"),
(post, dc_title, lit "Hi there!"),
@@ -68,4 +68,12 @@
</body>
</html>
-handler = pageHandler $ let ?graph = example in renderBoard blog
+handler req = do
+ e <- getEntry ["testdata","blog"]
+ bid <- case e of
+ Right (FileEntry _ r) -> return (bID r)
+ _ -> do bid <- writeGraph example
+ putBlock ["testdata","blog"] (bIRI bid)
+ return bid
+ graph <- readGraph bid
+ flip pageHandler req $ let ?graph = graph in renderBoard blog
More information about the Fencommits
mailing list