{-|
This module contains the starting point for a lsql-csv evaluation.
-}
module Lsql.Csv.Main (run) where

import Lsql.Csv.Lang.Args
import Lsql.Csv.Lang.BlockSeparator
import Lsql.Csv.Lang.From.Block
import Lsql.Csv.Lang.BlockChain

import Lsql.Csv.Core.BlockOps
import Lsql.Csv.Core.Symbols
import Lsql.Csv.Core.Evaluator

import Lsql.Csv.Utils.CsvGenerator


-- | The starting point for a lsql-csv evaluation. Returns a `String` with output CSV.
run :: Program -> IO String
run :: Program -> IO String
run Program
prog = do
  SymbolMap
symbol_map <- Program -> String -> IO SymbolMap
getFromSymbols Program
prog String
from_block

  let blocks :: [Block]
blocks = [String] -> [String] -> [Block]
parseBlocks [String]
rest_blocks([String] -> [Block]) -> [String] -> [Block]
forall a b. (a -> b) -> a -> b
$ SymbolMap -> [String]
symbolList SymbolMap
symbol_map
  let evaluated :: [Printable]
evaluated = SymbolMap -> [Block] -> [Printable]
evaluate SymbolMap
symbol_map [Block]
blocks
  
  String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(String -> IO String) -> String -> IO String
forall a b. (a -> b) -> a -> b
$ Char -> Char -> [Printable] -> String
csvGenerate Char
sep Char
sec_sep [Printable]
evaluated

  where
    Program String
command Char
sep Char
sec_sep Bool
_ = Program
prog
    
    blocks_split :: [String]
    blocks_split :: [String]
blocks_split = String -> [String]
splitBlocks String
command

    String
from_block : [String]
rest_blocks = [String]
blocks_split