GitHub
ESC

Errors

Purl::Error

All errors raised by purl.cr are instances of Purl::Error, which extends Crystal's Exception class.

class Purl::Error < Exception
end

When Errors Are Raised

Invalid Type

# Empty type
Purl::PackageURL.new("", nil, "name")
# => Purl::Error: Invalid type: type must not be empty

# Invalid characters in type
Purl::PackageURL.new("123invalid", nil, "name")
# => Purl::Error: Invalid type '123invalid': must start with a letter
#    and contain only ASCII letters, digits, '.', '+' or '-'

Invalid Name

# Empty name
Purl::PackageURL.new("npm", nil, "")
# => Purl::Error: Invalid name: name must not be empty

Invalid Qualifier Key

# Key starting with a digit
Purl::PackageURL.new("npm", nil, "express", nil,
  qualifiers: {"1key" => "value"})
# => Purl::Error: Invalid qualifier key '1key': must start with a letter
#    and contain only lowercase ASCII letters, digits, '.', '_' or '-'

Invalid Purl String

# Empty string
Purl::PackageURL.parse("")
# => Purl::Error: Invalid Package URL: empty string

# Missing scheme
Purl::PackageURL.parse("npm/express")
# => Purl::Error: Invalid Package URL: missing 'pkg:' scheme

# Wrong scheme
Purl::PackageURL.parse("http:npm/express")
# => Purl::Error: Invalid Package URL: scheme must be 'pkg', got 'http'

# Missing name
Purl::PackageURL.parse("pkg:npm/")
# => Purl::Error: Invalid Package URL: name must not be empty

Error Handling Pattern

require "purl"

def safe_parse(input : String) : Purl::PackageURL?
  Purl::PackageURL.parse(input)
rescue Purl::Error
  nil
end

if purl = safe_parse("pkg:npm/express@4.18.0")
  puts "Valid: #{purl.to_s}"
else
  puts "Invalid purl string"
end