#!/usr/bin/env ruby
# find unused dependencies in Cargo.toml
# this is a rough checker, please double check the result for special cases, e.g. features / macro / crate_name::fn()

require 'toml-rb'
require 'colorize'

def crates_in_rust_files(folder)
    Dir["#{folder}/**/*.rs"].inject([]) do |crates, file_name|
        File.readlines(file_name).grep(/use (\w*)(?:::|;)/) {|_| crates << $1}
        crates
    end.uniq
end

def crates_in_cargo_toml(folder)
    (TomlRB.load_file(File.join(folder, 'Cargo.toml'))['dependencies'] || {}).keys.map{|s| s.gsub(/-/, '_')}
end

def find_unused_dependencies(folder)
    puts "checking #{folder}/Cargo.toml"
    unused = crates_in_cargo_toml(folder) - crates_in_rust_files(folder)
    puts unused.empty? ? "OK".green : "Found #{unused}".red
end

folders = TomlRB.load_file(File.join(ARGV[0], 'Cargo.toml'))['workspace']['members'] + [ARGV[0]]
folders.each do |folder|
    find_unused_dependencies(folder)
end