-- Copyright 2017 Fernando Rincon Martin -- -- Licensed under the Apache License, Version 2.0 (the "License"); -- you may not use this file except in compliance with the License. -- You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, software -- distributed under the License is distributed on an "AS IS" BASIS, -- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- See the License for the specific language governing permissions and -- limitations under the License. {-# LANGUAGE TemplateHaskell #-} -- | -- Copyright: 2017 Fernando Rincon Martin -- License: Apache-2.0 -- -- Maintainer : frm.rincon@gmail.com -- Stability : experimental -- -- Ping wrapper. -- -- It calls ping utility and parse the result in a haskell data type. -- -- Currently only support win32 platform module Ping ( PingOptions(..) , PingResult(..) , performPing ) where import Data.Attoparsec.Ping import Data.Attoparsec.Text (parseOnly) import Data.Either.Combinators (mapLeft) import Data.List (intercalate) import Development.Placeholders import System.Process (readProcessWithExitCode) import Ping.CommonTypes import Ping.Platform -- | Execute synchronously the ping and return the parsed result performPing :: PingOptions -> IO (Either String PingResult) performPing opts = let parameters = pingParameters opts in do (exitCode, stdout, stderr) <- readProcessWithExitCode "ping" parameters "" return $ addContextToLeft stdout $ parseResult stdout where addContextToLeft stdout = mapLeft (addContext stdout) addContext stdout errorString = errorString ++ "\n" ++ "StdOut:\n" ++ unlines (fmap (\x -> " " ++ x) (lines stdout))