@@ -14,6 +14,8 @@ module Text.Libyaml
1414 ( -- * The event stream
1515 Event (..)
1616 , Style (..)
17+ , SequenceStyle (..)
18+ , MappingStyle (..)
1719 , Tag (..)
1820 , AnchorName
1921 , Anchor
@@ -49,8 +51,7 @@ import Control.Monad.Trans.Resource
4951import Data.Conduit hiding (Source, Sink, Conduit)
5052import Data.Data
5153
52−import Data.ByteString (ByteString, packCStringLen)
53−import qualified Data.ByteString
54+import Data.ByteString (ByteString, packCString, packCStringLen)
5455import qualified Data.ByteString.Char8 as B8
5556import qualified Data.ByteString.Internal as B
5657import qualified Data.ByteString.Unsafe as BU
@@ -62,12 +63,14 @@ data Event =
6263 | EventDocumentEnd
6364 | EventAlias !AnchorName
6465 | EventScalar !ByteString !Tag !Style !Anchor
65− | EventSequenceStart !Anchor
66+ | EventSequenceStart !Tag !SequenceStyle !Anchor
6667 | EventSequenceEnd
67− | EventMappingStart !Anchor
68+ | EventMappingStart !Tag !MappingStyle !Anchor
6869 | EventMappingEnd
6970 deriving (Show, Eq)
7071
72+-- | Style for scalars - e.g. quoted / folded
73+--
7174data Style = Any
7275 | Plain
7376 | SingleQuoted
@@ -77,6 +80,18 @@ data Style = Any
7780 | PlainNoTag
7881 deriving (Show, Read, Eq, Enum, Bounded, Ord, Data, Typeable)
7982
83+-- | Style for sequences - e.g. block or flow
84+--
85+-- @since 0.9.0
86+data SequenceStyle = AnySequence | BlockSequence | FlowSequence
87+ deriving (Show, Eq, Enum, Bounded, Ord, Data, Typeable)
88+
89+-- | Style for mappings - e.g. block or flow
90+--
91+-- @since 0.9.0
92+data MappingStyle = AnyMapping | BlockMapping | FlowMapping
93+ deriving (Show, Eq, Enum, Bounded, Ord, Data, Typeable)
94+
8095data Tag = StrTag
8196 | FloatTag
8297 | NullTag
@@ -217,9 +232,6 @@ foreign import ccall unsafe "get_scalar_length"
217232foreign import ccall unsafe "get_scalar_tag"
218233 c_get_scalar_tag :: EventRaw -> IO (Ptr CUChar)
219234
220−foreign import ccall unsafe "get_scalar_tag_len"
221− c_get_scalar_tag_len :: EventRaw -> IO CULong
222−
223235foreign import ccall unsafe "get_scalar_style"
224236 c_get_scalar_style :: EventRaw -> IO CInt
225237
@@ -229,12 +241,37 @@ foreign import ccall unsafe "get_scalar_anchor"
229241foreign import ccall unsafe "get_sequence_start_anchor"
230242 c_get_sequence_start_anchor :: EventRaw -> IO CString
231243
244+foreign import ccall unsafe "get_sequence_start_style"
245+ c_get_sequence_start_style :: EventRaw -> IO CInt
246+
247+foreign import ccall unsafe "get_sequence_start_tag"
248+ c_get_sequence_start_tag :: EventRaw -> IO (Ptr CUChar)
249+
232250foreign import ccall unsafe "get_mapping_start_anchor"
233251 c_get_mapping_start_anchor :: EventRaw -> IO CString
234252
253+foreign import ccall unsafe "get_mapping_start_style"
254+ c_get_mapping_start_style :: EventRaw -> IO CInt
255+
256+foreign import ccall unsafe "get_mapping_start_tag"
257+ c_get_mapping_start_tag :: EventRaw -> IO (Ptr CUChar)
258+
235259foreign import ccall unsafe "get_alias_anchor"
236260 c_get_alias_anchor :: EventRaw -> IO CString
237261
262+readAnchor :: (EventRaw -> IO CString) -> EventRaw -> IO Anchor
263+readAnchor getAnchor er = do
264+ yanchor <- getAnchor er
265+ if yanchor == nullPtr
266+ then return Nothing
267+ else Just <$> peekCString yanchor
268+
269+readStyle :: (Enum a) => (EventRaw -> IO CInt) -> EventRaw -> IO a
270+readStyle getStyle er = toEnum . fromEnum <$> getStyle er
271+
272+readTag :: (EventRaw -> IO (Ptr CUChar)) -> EventRaw -> IO Tag
273+readTag getTag er = bsToTag <$> (getTag er >>= packCString . castPtr)
274+
238275getEvent :: EventRaw -> IO (Maybe Event)
239276getEvent er = do
240277 et <- c_get_event_type er
@@ -253,37 +290,24 @@ getEvent er = do
253290 YamlScalarEvent -> do
254291 yvalue <- c_get_scalar_value er
255292 ylen <- c_get_scalar_length er
256− ytag <- c_get_scalar_tag er
257− ytag_len <- c_get_scalar_tag_len er
258− ystyle <- c_get_scalar_style er
259− let ytag_len' = fromEnum ytag_len
260293 let yvalue' = castPtr yvalue
261− let ytag' = castPtr ytag
262294 let ylen' = fromEnum ylen
263295 bs <- packCStringLen (yvalue', ylen')
264− tagbs <-
265− if ytag_len' == 0
266− then return Data.ByteString.empty
267− else packCStringLen (ytag', ytag_len')
268− let style = toEnum $ fromEnum ystyle
269− yanchor <- c_get_scalar_anchor er
270− anchor <- if yanchor == nullPtr
271− then return Nothing
272− else Just <$> peekCString yanchor
273− return $ Just $ EventScalar bs (bsToTag tagbs) style anchor
296+ tag <- readTag c_get_scalar_tag er
297+ style <- readStyle c_get_scalar_style er
298+ anchor <- readAnchor c_get_scalar_anchor er
299+ return $ Just $ EventScalar bs tag style anchor
274300 YamlSequenceStartEvent -> do
275− yanchor <- c_get_sequence_start_anchor er
276− anchor <- if yanchor == nullPtr
277− then return Nothing
278− else Just <$> peekCString yanchor
279− return $ Just $ EventSequenceStart anchor
301+ tag <- readTag c_get_sequence_start_tag er
302+ style <- readStyle c_get_sequence_start_style er
303+ anchor <- readAnchor c_get_sequence_start_anchor er
304+ return $ Just $ EventSequenceStart tag style anchor
280305 YamlSequenceEndEvent -> return $ Just EventSequenceEnd
281306 YamlMappingStartEvent -> do
282− yanchor <- c_get_mapping_start_anchor er
283− anchor <- if yanchor == nullPtr
284− then return Nothing
285− else Just <$> peekCString yanchor
286− return $ Just $ EventMappingStart anchor
307+ tag <- readTag c_get_mapping_start_tag er
308+ style <- readStyle c_get_mapping_start_style er
309+ anchor <- readAnchor c_get_mapping_start_anchor er
310+ return $ Just $ EventMappingStart tag style anchor
287311 YamlMappingEndEvent -> return $ Just EventMappingEnd
288312
289313-- Emitter
@@ -430,40 +454,48 @@ toEventRaw e f = allocaBytes eventSize $ \er -> do
430454 0 -- plain_implicit
431455 qi -- quoted_implicit
432456 style' -- style
433− EventSequenceStart Nothing ->
434− c_yaml_sequence_start_event_initialize
435− er
436− nullPtr
437− nullPtr
438− 1
439− 0 -- YAML_ANY_SEQUENCE_STYLE
440− EventSequenceStart (Just anchor) ->
441− withCString anchor $ \anchor' -> do
442− let anchorP = castPtr anchor'
457+ EventSequenceStart tag style Nothing ->
458+ withCString (tagToString tag) $ \tag' -> do
459+ let tagP = castPtr tag'
443460 c_yaml_sequence_start_event_initialize
444− er
445− anchorP
446− nullPtr
447− 1
448− 0 -- YAML_ANY_SEQUENCE_STYLE
461+ er
462+ nullPtr
463+ tagP
464+ 1
465+ (toEnum $ fromEnum style)
466+ EventSequenceStart tag style (Just anchor) ->
467+ withCString (tagToString tag) $ \tag' -> do
468+ let tagP = castPtr tag'
469+ withCString anchor $ \anchor' -> do
470+ let anchorP = castPtr anchor'
471+ c_yaml_sequence_start_event_initialize
472+ er
473+ anchorP
474+ tagP
475+ 1
476+ (toEnum $ fromEnum style)
449477 EventSequenceEnd ->
450478 c_yaml_sequence_end_event_initialize er
451− EventMappingStart Nothing ->
452− c_yaml_mapping_start_event_initialize
453− er
454− nullPtr
455− nullPtr
456− 1
457− 0 -- YAML_ANY_SEQUENCE_STYLE
458− EventMappingStart (Just anchor) ->
459− withCString anchor $ \anchor' -> do
460− let anchorP = castPtr anchor'
479+ EventMappingStart tag style Nothing ->
480+ withCString (tagToString tag) $ \tag' -> do
481+ let tagP = castPtr tag'
461482 c_yaml_mapping_start_event_initialize
462483 er
463− anchorP
464484 nullPtr
485+ tagP
465486 1
466− 0 -- YAML_ANY_SEQUENCE_STYLE
487+ (toEnum $ fromEnum style)
488+ EventMappingStart tag style (Just anchor) ->
489+ withCString (tagToString tag) $ \tag' -> do
490+ withCString anchor $ \anchor' -> do
491+ let tagP = castPtr tag'
492+ let anchorP = castPtr anchor'
493+ c_yaml_mapping_start_event_initialize
494+ er
495+ anchorP
496+ tagP
497+ 1
498+ (toEnum $ fromEnum style)
467499 EventMappingEnd ->
468500 c_yaml_mapping_end_event_initialize er
469501 EventAlias anchor ->