Module: Pangea::Resources::Validators::NetworkValidators

Defined in:
lib/pangea/resources/validators/network_validators.rb

Constant Summary collapse

CIDR_PATTERN =

Pre-compiled regex constants — compiled once, reused on every call.

%r{\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d{1,2}\z}.freeze
DOMAIN_PATTERN =
/\A(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\z/i.freeze
WILDCARD_DOMAIN_PATTERN =
/\A(\*\.)?(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\z/i.freeze
EMAIL_PATTERN =
/\A[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\z/.freeze

Instance Method Summary collapse

Instance Method Details

#valid_cidr!(value) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/pangea/resources/validators/network_validators.rb', line 27

def valid_cidr!(value)
  unless value.match?(CIDR_PATTERN)
    raise ValidationError, "Invalid CIDR format: #{value}"
  end

  ip, prefix = value.split('/')
  octets = ip.split('.').map(&:to_i)
  prefix_int = prefix.to_i

  unless octets.all? { |o| (0..255).include?(o) }
    raise ValidationError, "Invalid IP address in CIDR: #{value}"
  end

  unless (0..32).include?(prefix_int)
    raise ValidationError, "Invalid prefix length (0-32): #{value}"
  end

  value
end

#valid_domain!(value, allow_wildcard: false) ⇒ Object



63
64
65
66
67
68
69
70
# File 'lib/pangea/resources/validators/network_validators.rb', line 63

def valid_domain!(value, allow_wildcard: false)
  pattern = allow_wildcard ? WILDCARD_DOMAIN_PATTERN : DOMAIN_PATTERN

  unless value.match?(pattern)
    raise ValidationError, "Invalid domain name: #{value}"
  end
  value
end

#valid_email!(value) ⇒ Object



72
73
74
75
76
77
# File 'lib/pangea/resources/validators/network_validators.rb', line 72

def valid_email!(value)
  unless value.match?(EMAIL_PATTERN)
    raise ValidationError, "Invalid email format: #{value}"
  end
  value
end

#valid_port!(value) ⇒ Object



47
48
49
50
51
52
# File 'lib/pangea/resources/validators/network_validators.rb', line 47

def valid_port!(value)
  unless value.is_a?(Integer) && (0..65535).include?(value)
    raise ValidationError, "Port must be 0-65535, got: #{value}"
  end
  value
end

#valid_port_range!(from_port, to_port) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/pangea/resources/validators/network_validators.rb', line 54

def valid_port_range!(from_port, to_port)
  valid_port!(from_port)
  valid_port!(to_port)
  if from_port > to_port
    raise ValidationError, "from_port (#{from_port}) cannot exceed to_port (#{to_port})"
  end
  true
end