git.iko.soy/typeable/xsd-parser
on master help sign in
Parse enumerations (#4)
1f31ce4Yuras
src/Xsd/Parser.hs+9−1
@@ -168,11 +168,19 @@ parseRestriction c = do
168 _ -> parseError c "Multiple types"
168 _ -> parseError c "Multiple types"
169 Just t -> Xsd.Ref <$> makeQName c t
169 Just t -> Xsd.Ref <$> makeQName c t
170
170
171+ constraints <- parseConstrains c
172+
171 return Xsd.Restriction
173 return Xsd.Restriction
172 { Xsd.restrictionBase = tp
174 { Xsd.restrictionBase = tp
173− , Xsd.restrictionConstraints = [] -- TODO: implement me
175+ , Xsd.restrictionConstraints = constraints
174 }
176 }
175
177
178+parseConstrains :: Cursor -> P [Xsd.Constraint]
179+parseConstrains c = do
180+ enumerationAxis <- makeElemAxis "enumeration"
181+ forM (c $/ enumerationAxis) $ \e -> do
182+ Xsd.Enumeration <$> theAttribute "value" e
183+
176parseList :: Cursor -> P (Xsd.RefOr Xsd.SimpleType)
184parseList :: Cursor -> P (Xsd.RefOr Xsd.SimpleType)
177parseList c =
185parseList c =
178 -- XXX: generalaze RefOr parsing
186 -- XXX: generalaze RefOr parsing
src/Xsd/Types.hs+1
@@ -7,6 +7,7 @@ module Xsd.Types
7, Type(..)
7, Type(..)
8, SimpleType(..)
8, SimpleType(..)
9, Restriction(..)
9, Restriction(..)
10+, Constraint(..)
10, ComplexType(..)
11, ComplexType(..)
11, RefOr(..)
12, RefOr(..)
12, Element(..)
13, Element(..)
test/Spec.hs+27−1
@@ -93,6 +93,32 @@ spec = do
93 Xsd.restrictionBase restriction `shouldBe`
93 Xsd.restrictionBase restriction `shouldBe`
94 Xsd.Ref (Xsd.QName (Just (Xsd.Namespace "something")) "string")
94 Xsd.Ref (Xsd.QName (Just (Xsd.Namespace "something")) "string")
95
95
96+ context "when restriction contains enumerations" $ do
97+ it "parses them" $ do
98+ let
99+ doc = mkDoc $
100+ mkElem "schema"
101+ (Map.fromList [("xmlns:xs","something")])
102+ [NodeElement $ mkElem "simpleType"
103+ (Map.fromList [("name", "str")])
104+ [NodeElement $ mkElem "restriction"
105+ (Map.fromList [("base", "xs:string")])
106+ [ NodeElement $ mkElem "enumeration"
107+ (Map.fromList [("value", "value1")]) []
108+ , NodeElement $ mkElem "enumeration"
109+ (Map.fromList [("value", "value2")]) []
110+ ]]]
111+ res = Xsd.parse Xsd.defaultConfig doc
112+ Right [Xsd.ChildType tpName (Xsd.TypeSimple t)] =
113+ fmap Xsd.children res
114+ Xsd.AtomicType restriction _ = t
115+ res `shouldSatisfy` isRight
116+ tpName `shouldBe` (Xsd.QName Nothing "str")
117+ Xsd.restrictionConstraints restriction `shouldBe`
118+ [ Xsd.Enumeration "value1"
119+ , Xsd.Enumeration "value2"
120+ ]
121+
96 context "when restrication base is inlined" $ do
122 context "when restrication base is inlined" $ do
97 it "parses it" $ do
123 it "parses it" $ do
98 let
124 let
@@ -117,7 +143,7 @@ spec = do
117 Xsd.restrictionBase restriction `shouldBe`
143 Xsd.restrictionBase restriction `shouldBe`
118 Xsd.Ref (Xsd.QName (Just (Xsd.Namespace "something")) "string")
144 Xsd.Ref (Xsd.QName (Just (Xsd.Namespace "something")) "string")
119
145
120− context "when base is refers to an unbound prefix" $ do
146+ context "when base refers to an unbound prefix" $ do
121 it "fails" $ do
147 it "fails" $ do
122 let
148 let
123 doc = mkDoc $
149 doc = mkDoc $