-- 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 #-}
{-# LANGUAGE OverloadedStrings #-}

{-|
Parser for ping output. Common Types.
-}
module Data.Attoparsec.Ping
  ( PingResult(..)
  , PingError(..)
  , LineResult(..)
  , ReplyResult(..)
  ) where

import Control.Applicative ((<|>))
import Data.Attoparsec.Text
import Data.IP
import Data.Text (Text)
import qualified Data.Text as T
import Data.Word (Word32)
import Development.Placeholders

data PingResult
  = PingSucceed { hostAddress :: IPv4
                , hostNameResolved :: Maybe Text
                , bytesOfData :: Int
                , lineResults :: [LineResult] }
  | PingError PingError
  deriving (Eq, Show)

data PingError =
  HostNotFound Text
  deriving (Eq, Show)

data LineResult
  = ReplyFrom IPv4
              ReplyResult
  | RequestTimedOut
  | GeneralFailure
  deriving (Eq, Show)

data ReplyResult
  = ResponseReceived { bytes :: Int
                     , timeInMs :: Int
                     , ttl :: Int }
  | DestinationHostUnreachable
  deriving (Eq, Show)