1. #[derive(Debug)]
2. enum Language {
3. Rust,
4. Java,
5. Perl,
6. }
8. #[derive(Clone, Debug)]
9. struct Dependency {
10. name: String,
11. version_expression: String,
12. }
14. /// A representation of a software package.
15. #[derive(Debug)]
16. struct Package {
17. name: String,
18. version: String,
19. authors: Vec<String>,
20. dependencies: Vec<Dependency>,
21. language: Option<Language>,
22. }
24. impl Package {
25. /// Return a representation of this package as a dependency, for use in
26. /// building other packages.
27. fn as_dependency(&self) -> Dependency {
28. Dependency {
29. name: self.name.clone(),
30. version_expression: self.version.clone(),
31. }
32. }
33. }
35. /// A builder for a Package. Use `build()` to create the `Package` itself.
36. struct PackageBuilder(Package);
38. impl PackageBuilder {
39. fn new(name: impl Into<String>) -> Self {
40. Self(Package {
41. name: name.into(),
42. version: "0.1".into(),
43. authors: vec![],
44. dependencies: vec![],
45. language: None,
46. })
47. }
49. /// Set the package version.
50. fn version(mut self, version: impl Into<String>) -> Self {
51. self.0.version = version.into();
52. self
53. }
55. /// Set the package authors.
56. fn authors(mut self, authors: Vec<String>) -> Self {
57. self.0.authors = authors;
58. self
59. }
61. /// Add an additional dependency.
62. fn dependency(mut self, dependency: Dependency) -> Self {
63. self.0.dependencies.push(dependency);
64. self
65. }
67. /// Set the language. If not set, language defaults to None.
68. fn language(mut self, language: Language) -> Self {
69. self.0.language = Some(language);
70. self
71. }
73. fn build(self) -> Package {
74. self.0
75. }
76. }
78. fn main() {
79. let base64 = PackageBuilder::new("base64").version("0.13").build();
80. println!("base64: {base64:?}");
81. let log =
82. PackageBuilder::new("log").version("0.4").language(Language::Rust).build();
83. println!("log: {log:?}");
84. let serde = PackageBuilder::new("serde")
85. .authors(vec!["djmitche".into()])
86. .version(String::from("4.0"))
87. .dependency(base64.as_dependency())
88. .dependency(log.as_dependency())
89. .build();
90. println!("serde: {serde:?}");
91. }