forked from GitHub/gf-core
Added first version of the GF FastCGI server.
This commit is contained in:
53
src/server/MainFastCGI.hs
Normal file
53
src/server/MainFastCGI.hs
Normal file
@@ -0,0 +1,53 @@
|
||||
import PGF
|
||||
import FastCGIUtils
|
||||
|
||||
import Network.CGI hiding (Language)
|
||||
import Text.JSON
|
||||
import qualified Codec.Binary.UTF8.String as UTF8 (encodeString)
|
||||
|
||||
import Data.Maybe
|
||||
|
||||
|
||||
grammarFile :: FilePath
|
||||
grammarFile = "grammar.pgf"
|
||||
|
||||
|
||||
newtype Record a = Record { unRecord :: [(String,a)] }
|
||||
|
||||
type Translation = Record [Record String]
|
||||
|
||||
instance JSON a => JSON (Record a) where
|
||||
readJSON = fmap (Record . fromJSObject) . readJSON
|
||||
showJSON = showJSON . toJSObject . unRecord
|
||||
|
||||
main :: IO ()
|
||||
main = do initFastCGI
|
||||
r <- newDataRef
|
||||
loopFastCGI (fcgiMain r)
|
||||
|
||||
fcgiMain :: DataRef PGF -> CGI CGIResult
|
||||
fcgiMain ref = getData readPGF ref grammarFile >>= cgiMain
|
||||
|
||||
cgiMain :: PGF -> CGI CGIResult
|
||||
cgiMain pgf =
|
||||
do path <- pathInfo
|
||||
case path of
|
||||
"/translate" -> do input <- fmap (fromMaybe "") $ getInput "input"
|
||||
mcat <- getInput "cat"
|
||||
mfrom <- getInput "from"
|
||||
mto <- getInput "to"
|
||||
outputJSON $ translate pgf input mcat mfrom mto
|
||||
_ -> outputNotFound path
|
||||
|
||||
outputJSON :: JSON a => a -> CGI CGIResult
|
||||
outputJSON x = do setHeader "Content-Type" "text/json; charset=utf-8"
|
||||
output $ UTF8.encodeString $ encode x
|
||||
|
||||
translate :: PGF -> String -> Maybe Category -> Maybe Language -> Maybe Language -> Translation
|
||||
translate pgf input mcat mfrom mto =
|
||||
Record [(from, [Record [(to, linearize pgf to tree) | to <- toLangs] | tree <- parse pgf from cat input])
|
||||
| from <- fromLangs]
|
||||
where cat = fromMaybe (startCat pgf) mcat
|
||||
fromLangs = maybe (languages pgf) (:[]) mfrom
|
||||
toLangs = maybe (languages pgf) (:[]) mfrom
|
||||
|
||||
Reference in New Issue
Block a user