78 lines
2.3 KiB
Haskell
78 lines
2.3 KiB
Haskell
module Node.Stream.CSV.Parse where
|
|
|
|
import Prelude hiding (join)
|
|
|
|
import Data.Nullable (Nullable)
|
|
import Effect (Effect)
|
|
import Effect.Uncurried (mkEffectFn1)
|
|
import Foreign (Foreign, unsafeToForeign)
|
|
import Foreign.Object (Object)
|
|
import Foreign.Object (union) as Object
|
|
import Node.Buffer (Buffer)
|
|
import Node.EventEmitter (EventHandle(..))
|
|
import Node.EventEmitter.UtilTypes (EventHandle1)
|
|
import Node.Stream (Read, Stream, Write)
|
|
import Node.Stream.Object (Transform) as Object
|
|
import Prim.Row (class Union)
|
|
import Unsafe.Coerce (unsafeCoerce)
|
|
|
|
data CSVRead
|
|
|
|
-- | Stream transforming chunks of a CSV file
|
|
-- | into parsed purescript objects.
|
|
-- |
|
|
-- | The CSV contents may be piped into this stream
|
|
-- | as Buffer or String chunks.
|
|
type CSVParser :: Row Type -> Type
|
|
type CSVParser r = Stream (read :: Read, write :: Write, csv :: CSVRead | r)
|
|
|
|
-- | https://csv.js.org/parse/options/
|
|
type Config r =
|
|
( bom :: Boolean
|
|
, group_columns_by_name :: Boolean
|
|
, comment :: String
|
|
, comment_no_infix :: Boolean
|
|
, delimiter :: String
|
|
, encoding :: String
|
|
, escape :: String
|
|
, from :: Int
|
|
, from_line :: Int
|
|
, ignore_last_delimiters :: Boolean
|
|
, info :: Boolean
|
|
, max_record_size :: Int
|
|
, quote :: String
|
|
, raw :: Boolean
|
|
, record_delimiter :: String
|
|
, relax_column_count :: Boolean
|
|
, skip_empty_lines :: Boolean
|
|
, skip_records_with_empty_values :: Boolean
|
|
, skip_records_with_error :: Boolean
|
|
, to :: Int
|
|
, to_line :: Int
|
|
, trim :: Boolean
|
|
, ltrim :: Boolean
|
|
, rtrim :: Boolean
|
|
| r
|
|
)
|
|
|
|
-- | Create a CSVParser
|
|
make :: forall @config @missing @extra. Union config missing (Config extra) => { | config } -> Effect (CSVParser ())
|
|
make = makeImpl <<< unsafeToForeign <<< Object.union (recordToForeign { columns: false, cast: false, cast_date: false }) <<< recordToForeign
|
|
|
|
toObjectStream :: CSVParser () -> Object.Transform Buffer (Array String)
|
|
toObjectStream = unsafeCoerce
|
|
|
|
-- | `data` event. Emitted when a CSV record has been parsed.
|
|
dataH :: forall a. EventHandle1 (CSVParser a) (Array String)
|
|
dataH = EventHandle "data" mkEffectFn1
|
|
|
|
-- | FFI
|
|
foreign import makeImpl :: forall r. Foreign -> Effect (Stream r)
|
|
|
|
-- | FFI
|
|
foreign import readImpl :: forall r. Stream r -> Effect (Nullable (Array String))
|
|
|
|
-- | FFI
|
|
recordToForeign :: forall r. Record r -> Object Foreign
|
|
recordToForeign = unsafeCoerce
|