Module: Datadog::Core::Utils::Duration

Defined in:
lib/datadog/core/utils/duration.rb

Overview

Helper methods for parsing string values into Numeric

Class Method Summary collapse

Class Method Details

.call(value, base: :s) ⇒ Object



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
# File 'lib/datadog/core/utils/duration.rb', line 8

def self.call(value, base: :s)
  cast = if value.include?('.')
    method(:Float)
  else
    method(:Integer)
  end

  scale = case base
  when :s
    1_000_000_000
  when :ms
    1_000_000
  when :us
    1000
  when :ns
    1
  else
    raise ArgumentError, "invalid base: #{base.inspect}"
  end

  result = case value
  when /^(\d+(?:\.\d+)?)h$/
    cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
  when /^(\d+(?:\.\d+)?)m$/
    cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
  when /^(\d+(?:\.\d+)?)s$/
    cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
  when /^(\d+(?:\.\d+)?)ms$/
    cast.call(Regexp.last_match(1)) * 1_000_000 / scale
  when /^(\d+(?:\.\d+)?)us$/
    cast.call(Regexp.last_match(1)) * 1_000 / scale
  when /^(\d+(?:\.\d+)?)ns$/
    cast.call(Regexp.last_match(1)) / scale
  when /^(\d+(?:\.\d+)?)$/
    cast.call(Regexp.last_match(1))
  else
    raise ArgumentError, "invalid duration: #{value.inspect}"
  end
  # @type var result: Numeric
  result.round
end