musicxml-0.1: tests/Test/MusicXML.lhs
\begin{code}
-- |
module Main where
import Text.XML.MusicXML hiding (String) -- MusicXML package
import System.IO
import Data.Maybe
import System.Environment
import System.Console.GetOpt
import Prelude
\end{code}
\begin{code}
-- |
data Option = List FilePath
| Help
| Version
deriving (Eq, Show)
options :: [OptDescr Option]
options = [
Option ['v','V'] ["version"] (NoArg Version) "show version number"
, Option ['h','H','?'] ["help"] (NoArg Help) "show help"
, Option ['l','m'] ["manifest"] (ReqArg List "MANIFEST") "manifest file"
]
-- |
header :: String -> String
header prog = "Usage: "++ prog ++" [OPTIONS...] FILES..."
-- |
proc :: [Option] -> [String] -> IO ()
proc [] files = main' (zip ([1..]::[Int]) files)
proc ((List file):t) files = do
list <- readFile file
proc t (lines list ++ files)
proc (_:t) files = proc t files
\end{code}
\begin{code}
mkoutput :: FilePath -> FilePath
mkoutput = reverse . ("lmx.tuptuo-"++) . drop 4 . reverse
\end{code}
\begin{code}
-- |
put :: String -> IO ()
put msg = putStr msg >> hFlush stdout
putLn :: String -> IO ()
putLn msg = putStrLn msg >> hFlush stdout
putBool :: Bool -> IO ()
putBool True = putStrLn "[Ok]"
putBool False = putStrLn "[Failed]"
\end{code}
\begin{code}
-- |
inout :: FilePath -> IO ()
inout file = do
putLn ("file: "++show file) >> put "Reading "
contents <- readFile file
r1 <- return (read_CONTENTS read_MusicXMLDoc file contents)
r2 <- return (case isOK r1 of
True -> Just (mkoutput file, fromOK r1); False -> Nothing)
putBool (isOK r1)
put "Writing "
r3 <- return (fmap (\(a,b) ->
(a, show_CONTENTS show_MusicXMLDoc b)) r2)
maybe (return ()) (uncurry writeFile) r3
putBool (isJust r3)
\end{code}
\begin{code}
-- |
main :: IO ()
main = do
argv <- getArgs
prog <- getProgName
case getOpt Permute options argv of
(o,n,[]) | Help`elem`o -> putStrLn (usageInfo (header prog) options)
| Version`elem`o -> putStrLn (unwords [prog])
| otherwise -> proc o n
(_,_,errs) -> putStrLn (unlines errs ++ usageInfo (header prog) options)
-- |
main' :: [(Int, FilePath)] -> IO ()
main' [] = return ()
main' ((a,b):t) = do
putLn ("\nNumber: " ++ show a) >> inout b >> main' t
\end{code}