Support for hierarchical structures.

Ilya Portnov [2010-04-22 15:23:07]
Support for hierarchical structures.
Filename
Network/YAML/Base.hs
Network/YAML/Derive.hs
TestDerive.hs
diff --git a/Network/YAML/Base.hs b/Network/YAML/Base.hs
index 847ff41..3c82805 100644
--- a/Network/YAML/Base.hs
+++ b/Network/YAML/Base.hs
@@ -37,11 +37,11 @@ getSubKey key subkey obj = do
   r <- getAttr subkey attr
   getScalar r

-getItem :: (IsYamlScalar a) => BS.ByteString -> Int -> YamlObject -> Maybe a
+getItem :: BS.ByteString -> Int -> YamlObject -> YamlObject
 getItem key k obj =
   case getListAttr key obj of
-    [] -> Nothing
-    lst -> getScalar (lst !! k)
+    [] ->  Sequence []
+    lst -> lst !! k

 getListAttr :: BS.ByteString -> YamlObject -> [YamlObject]
 getListAttr key obj =
diff --git a/Network/YAML/Derive.hs b/Network/YAML/Derive.hs
index a68bb9e..44dfbda 100644
--- a/Network/YAML/Derive.hs
+++ b/Network/YAML/Derive.hs
@@ -75,7 +75,7 @@ fromClause (NormalC name fields) = do
         body = foldl appE (conE $ mkName cName) $ map (getAttr' cName obj) $ map fst (zip [0..] names)
     clause [varP obj] (guardedB [normalGE guard body]) []
   where
-    getAttr' c obj k = [| fromMaybe def $ getItem (BS.pack c) k $(varE obj) |]
+    getAttr' c obj k = [| cs $ getItem (BS.pack c) k $(varE obj) |]
     getName (n,x) = (n, getNameBase x)


diff --git a/TestDerive.hs b/TestDerive.hs
index e61d108..08578f2 100644
--- a/TestDerive.hs
+++ b/TestDerive.hs
@@ -12,6 +12,7 @@ import Network.YAML.Derive
 data Test = Test {getX :: Int, getY :: Int}
           | Another {getA :: Double}
           | Third Int Double
+          | Fourth Double Test
   deriving(Show)

 $(deriveDefault ''Test)
@@ -21,6 +22,7 @@ $(deriveIsYamlObject ''Test)
 t1 = Test 3 5
 t2 = Another 7.5
 t3 = Third 2 1.5
+t4 = Fourth 1.7 t1

 test :: Test -> IO ()
 test t = do
@@ -32,4 +34,5 @@ main = do
   test t1
   test t2
   test t3
+  test t4
ViewGit