49 lines
1.4 KiB
Haskell
49 lines
1.4 KiB
Haskell
|
|
module Main (main) where
|
||
|
|
|
||
|
|
import Interop.Shared (Summary (..))
|
||
|
|
import RustClient (callRustMessage, callRustSummary)
|
||
|
|
import System.Environment (getArgs)
|
||
|
|
import Text.Read (readMaybe)
|
||
|
|
|
||
|
|
main :: IO ()
|
||
|
|
main = do
|
||
|
|
args <- getArgs
|
||
|
|
let (name, left, right) = parseArgs args
|
||
|
|
summary <- callRustSummary left right
|
||
|
|
message <- callRustMessage name left right
|
||
|
|
|
||
|
|
putStrLn "Haskell -> Rust demo"
|
||
|
|
putStrLn $ "Inputs: name=" ++ name ++ ", left=" ++ show left ++ ", right=" ++ show right
|
||
|
|
putStrLn $ "Stats from Rust: " ++ renderSummary summary
|
||
|
|
putStrLn $ "Message from Rust: " ++ message
|
||
|
|
|
||
|
|
parseArgs :: [String] -> (String, Int, Int)
|
||
|
|
parseArgs args =
|
||
|
|
let name = case args of
|
||
|
|
value : _ -> value
|
||
|
|
[] -> "Ada"
|
||
|
|
left = maybe 7 id (pickNumber 1 args)
|
||
|
|
right = maybe 5 id (pickNumber 2 args)
|
||
|
|
in (name, left, right)
|
||
|
|
|
||
|
|
pickNumber :: Int -> [String] -> Maybe Int
|
||
|
|
pickNumber index values = do
|
||
|
|
value <- safeIndex index values
|
||
|
|
readMaybe value
|
||
|
|
|
||
|
|
safeIndex :: Int -> [a] -> Maybe a
|
||
|
|
safeIndex index values
|
||
|
|
| index < 0 = Nothing
|
||
|
|
| otherwise = case drop index values of
|
||
|
|
value : _ -> Just value
|
||
|
|
[] -> Nothing
|
||
|
|
|
||
|
|
renderSummary :: Summary -> String
|
||
|
|
renderSummary summary =
|
||
|
|
"total="
|
||
|
|
++ show (total summary)
|
||
|
|
++ ", product="
|
||
|
|
++ show (combinedProduct summary)
|
||
|
|
++ ", gap="
|
||
|
|
++ show (gap summary)
|