-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConverter.php
121 lines (104 loc) · 2.94 KB
/
Converter.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php
namespace olakunlevpn\BitcoinNairaConverter;
use GuzzleHttp\Client;
use olakunlevpn\BitcoinNairaConverter\Provider\CoinbaseProvider;
use olakunlevpn\BitcoinNairaConverter\Provider\ProviderInterface;
use olakunlevpn\BitcoinNairaConverter\Exception\InvalidArgumentException;
class Converter
{
/**
* Provider instance.
*
* @var olakunlevpn\BitcoinNairaConverter\Provider\ProviderInterface
*/
protected $provider;
/**
* Create Converter instance.
*
* @param ProviderInterface $provider
*/
public function __construct(ProviderInterface $provider = null)
{
if (is_null($provider)) {
$provider = new CoinbaseProvider;
}
$this->provider = $provider;
}
/**
* Convert Bitcoin amount to a specific currency.
*
* @param string $currencyCode
* @param float $btcAmount
* @return float
*/
public function toCurrency($currencyCode, $btcAmount)
{
$rate = $this->getRate($currencyCode);
$value = $this->computeCurrencyValue($btcAmount, $rate);
return $this->formatToCurrency($currencyCode, $value);
}
/**
* Get rate of currency.
*
* @param string $currencyCode
* @return float
*/
protected function getRate($currencyCode)
{
return $this->provider->getRate($currencyCode);
}
/**
* Compute currency value.
*
* @param float $btcAmount
* @param float $rate
* @return float
* @throws olakunlevpn\BitcoinNairaConverter\Exception\InvalidArgumentException
*/
protected function computeCurrencyValue($btcAmount, $rate)
{
if (! is_numeric($btcAmount)) {
throw new InvalidArgumentException("Argument \$btcAmount should be numeric, '{$btcAmount}' given.");
}
return $btcAmount * $rate;
}
/**
* Format value based on currency.
*
* @param string $currencyCode
* @param float $value
* @return float
*/
protected function formatToCurrency($currencyCode, $value)
{
return format_to_currency($currencyCode, $value);
}
/**
* Convert currency amount to Bitcoin.
*
* @param float $amount
* @param string $currency
* @return float
*/
public function toBtc($amount, $currencyCode)
{
$rate = $this->getRate($currencyCode);
$value = $this->computeBtcValue($amount, $rate);
return $this->formatToCurrency('BTC', $value);
}
/**
* Compute Bitcoin value.
*
* @param float $amount
* @param float $rate
* @return float
* @throws olakunlevpn\BitcoinNairaConverter\Exception\InvalidArgumentException
*/
protected function computeBtcValue($amount, $rate)
{
if (! is_numeric($amount)) {
throw new InvalidArgumentException("Argument \$amount should be numeric, '{$amount}' given.");
}
return $amount / $rate;
}
}