Skip to content

Instantly share code, notes, and snippets.

@polachok
Created August 8, 2015 01:36
Show Gist options
  • Select an option

  • Save polachok/c0ae68a437b92025385e to your computer and use it in GitHub Desktop.

Select an option

Save polachok/c0ae68a437b92025385e to your computer and use it in GitHub Desktop.
I ♡ attoparsec
{-# LANGUAGE OverloadedStrings, DeriveDataTypeable, TemplateHaskell, DeriveGeneric #-}
import Data.Text(Text)
import qualified Data.Text as Text
import qualified Data.Text.IO as Text
import Data.Attoparsec.Text
import Control.Applicative
import Control.Monad
import Data.Aeson(encode,ToJSON)
import Data.Typeable(Typeable)
import Data.Data(Data)
import qualified Data.ByteString.Lazy.Char8 as BS
import GHC.Generics
data Directive = Directive { name :: Text, value :: Text } | Block { name :: Text, directives :: [Directive] } deriving (Show,Data,Typeable,Generic)
instance ToJSON Directive
type Config = [Directive]
config :: Parser Config
config = many directive <* endOfInput
directiveName :: Parser Text
directiveName = Text.pack <$> some (letter <|> char '_')
directive = blockDirective <|> simpleDirective
blockDirective :: Parser Directive
blockDirective = Block <$> (directiveName <* skipSpace) <*> (char '{' *> skipSpace *> many directive <* char '}') <* endOfLine <* skipSpace
simpleDirective :: Parser Directive
simpleDirective = Directive <$> (directiveName <* skipSpace) <*> takeWhile1 (/= ';') <* char ';' <* endOfLine <* skipSpace
main = Text.readFile "nginx/nginx.conf" >>= \s -> BS.putStrLn $ encode $ parseOnly config s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment