class RbSys::Cargo::Metadata

Extracts metadata from a Cargo project using ‘cargo metadata`.

def cargo_metadata

def cargo_metadata
  return @cargo_metadata if @cargo_metadata
  ::Gem.load_yaml
  cargo = ENV["CARGO"] || "cargo"
  args = ["metadata", "--format-version", "1"]
  args << "--no-deps" unless @deps
  out, stderr, status = Open3.capture3(cargo, *args)
  raise "exited with non-zero status (#{status})" unless status.success?
  data = Gem::SafeYAML.safe_load(out)
  raise "metadata must be a Hash" unless data.is_a?(Hash)
  @cargo_metadata = data
rescue => err
  raise CargoMetadataError.new(err, stderr)
end

def edition

Returns:
  • (String) -
def edition
  package_metadata.fetch("edition")
end

def features

Returns:
  • (Array) -
def features
  package_metadata.fetch("features")
end

def id

Returns:
  • (String) -
def id
  package_metadata.fetch("id")
end

def inferred(deps: false)

Returns:
  • (RbSys::Cargo::Metadata) -
def inferred(deps: false)
  new(File.read("Cargo.toml").match(/^name = "(.*)"/)[1], deps: deps)
rescue
  new(File.basename(Dir.pwd), deps: deps)
end

def initialize(name, deps: false)

Parameters:
  • name (String) -- the name of the Cargo project
def initialize(name, deps: false)
  raise ArgumentError, "name must be a String" unless name.is_a?(String)
  @name = name
  @cargo_metadata = nil
  @package_metadata = nil
  @deps = deps
end

def load!

Returns:
  • (RbSys::Cargo::Metadata) -
def load!
  cargo_metadata
  self
end

def manifest_directory

Returns:
  • (String) -
def manifest_directory
  @manifest_directory ||= File.dirname(manifest_path)
end

def manifest_path

Returns:
  • (String) -
def manifest_path
  package_metadata.fetch("manifest_path")
end

def metadata

Returns:
  • (Hash) -
def metadata
  package_metadata.fetch("metadata")
end

def new_or_inferred(name, deps: false)

Parameters:
  • name (String) -- the name of the Cargo project
def new_or_inferred(name, deps: false)
  new(name, deps: deps).load!
rescue CargoMetadataError
  inferred
end

def package_metadata

def package_metadata
  return @package_metadata if @package_metadata
  found = cargo_metadata.fetch("packages").find { |p| p.fetch("name") == name }
  raise PackageNotFoundError, @name unless found
  @package_metadata = found
end

def packages

Returns:
  • (Array) -
def packages
  cargo_metadata.fetch("packages")
end

def rb_sys_version

Returns:
  • (String) -
def rb_sys_version
  pkg = packages.find { |p| p.fetch("name") == "rb-sys" }
  return unless pkg
  pkg["version"]
end

def target_directory

Returns:
  • (String) -
def target_directory
  cargo_metadata.fetch("target_directory")
end

def version

Returns:
  • (String) -
def version
  package_metadata.fetch("version")
end

def workspace_root

Returns:
  • (String) -
def workspace_root
  cargo_metadata.fetch("workspace_root")
end