sticks 0.3.6

A tool for managing C and C++ projects
Documentation
use std::str::FromStr;

#[derive(Debug, Clone, Copy, PartialEq)]
pub enum PackageManager {
	Conan,
	Vcpkg,
}

impl std::fmt::Display for PackageManager {
	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
		match self {
			PackageManager::Conan => write!(f, "Conan"),
			PackageManager::Vcpkg => write!(f, "vcpkg"),
		}
	}
}

impl FromStr for PackageManager {
	type Err = anyhow::Error;

	fn from_str(input: &str) -> Result<PackageManager, Self::Err> {
		match input.to_lowercase().as_str() {
			"conan" => Ok(PackageManager::Conan),
			"vcpkg" => Ok(PackageManager::Vcpkg),
			_ => anyhow::bail!(
				"Unsupported package manager: {}. Use 'conan' or 'vcpkg'",
				input
			),
		}
	}
}

pub trait PackageManagerGenerator {
	fn name(&self) -> &'static str;
	fn generate_manifest(&self, project_name: &str) -> String;
	fn extension(&self) -> &'static str;
	fn generate_install_instructions(&self) -> String;
}

pub struct ConanGenerator;

impl PackageManagerGenerator for ConanGenerator {
	fn name(&self) -> &'static str {
		"Conan"
	}

	fn extension(&self) -> &'static str {
		"conanfile.txt"
	}

	fn generate_manifest(&self, _project_name: &str) -> String {
		"[requires]\n\
		\n\
		[generators]\n\
		CMakeDeps\n\
		CMakeToolchain\n\
		\n\
		[options]\n\
		\n\
		[imports]\n"
			.to_string()
	}

	fn generate_install_instructions(&self) -> String {
		"To use Conan with this project:\n\n\
		1. Install Conan: pip install conan\n\
		2. Add dependencies to conanfile.txt in [requires] section:\n\
		   Example: libcurl/7.85.0\n\
		3. Install dependencies: conan install . --build=missing\n\
		4. Use generated CMake toolchain in your CMakeLists.txt"
			.to_string()
	}
}

pub struct VcpkgGenerator;

impl PackageManagerGenerator for VcpkgGenerator {
	fn name(&self) -> &'static str {
		"vcpkg"
	}

	fn extension(&self) -> &'static str {
		"vcpkg.json"
	}

	fn generate_manifest(&self, project_name: &str) -> String {
		format!(
			"{{\n\
			  \"name\": \"{}\",\n\
			  \"version\": \"0.1.0\",\n\
			  \"dependencies\": [\n\
			  \n\
			  ]\n\
			}}\n",
			project_name
		)
	}

	fn generate_install_instructions(&self) -> String {
		"To use vcpkg with this project:\n\n\
		1. Clone vcpkg: git clone https://github.com/Microsoft/vcpkg.git\n\
		2. Run bootstrap: ./vcpkg/bootstrap-vcpkg.sh\n\
		3. Add dependencies to vcpkg.json in \"dependencies\" array:\n\
		   Example: \"libcurl:x64-linux\"\n\
		4. Install: ./vcpkg/vcpkg install\n\
		5. Use vcpkg toolchain in CMakeLists.txt:\n\
		   -DCMAKE_TOOLCHAIN_FILE=./vcpkg/scripts/buildsystems/vcpkg.cmake"
			.to_string()
	}
}

pub fn get_package_manager_generator(pm: PackageManager) -> Box<dyn PackageManagerGenerator> {
	match pm {
		PackageManager::Conan => Box::new(ConanGenerator),
		PackageManager::Vcpkg => Box::new(VcpkgGenerator),
	}
}