module Cardano.Rpc.Server.Internal.UtxoRpc.Type.Rational
  ( utxoRpcRationalNumberToRational
  )
where

import Cardano.Rpc.Proto.Api.UtxoRpc.Query qualified as U5c

import RIO

import Data.Ratio ((%))
import Network.GRPC.Spec

-- | Convert a protobuf 'U5c.RationalNumber' into a 'Rational'.
--
-- Fails with 'Nothing' when the denominator is zero, which is also the
-- default value of the protobuf field when it is omitted.
utxoRpcRationalNumberToRational :: Proto U5c.RationalNumber -> Maybe Rational
utxoRpcRationalNumberToRational :: Proto RationalNumber -> Maybe Rational
utxoRpcRationalNumberToRational Proto RationalNumber
r =
  case Proto RationalNumber
r Proto RationalNumber
-> Getting Word32 (Proto RationalNumber) Word32 -> Word32
forall s a. s -> Getting a s a -> a
^. Getting Word32 (Proto RationalNumber) Word32
forall (f :: * -> *) s a.
(Functor f, HasField s "denominator" a) =>
LensLike' f s a
U5c.denominator of
    Word32
0 -> Maybe Rational
forall a. Maybe a
Nothing
    Word32
den -> Rational -> Maybe Rational
forall a. a -> Maybe a
Just (Rational -> Maybe Rational) -> Rational -> Maybe Rational
forall a b. (a -> b) -> a -> b
$ Proto RationalNumber
r Proto RationalNumber
-> Getting Integer (Proto RationalNumber) Integer -> Integer
forall s a. s -> Getting a s a -> a
^. LensLike' (Const Integer) (Proto RationalNumber) Int32
forall (f :: * -> *) s a.
(Functor f, HasField s "numerator" a) =>
LensLike' f s a
U5c.numerator LensLike' (Const Integer) (Proto RationalNumber) Int32
-> ((Integer -> Const Integer Integer)
    -> Int32 -> Const Integer Int32)
-> Getting Integer (Proto RationalNumber) Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int32 -> Integer) -> SimpleGetter Int32 Integer
forall s a. (s -> a) -> SimpleGetter s a
to Int32 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
% Word32 -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
den