Alıştırma: İnşa Edici / Yapıcı Tür (Builder Type)

Bu örnekte, tüm verilerine sahip olan karmaşık bir veri türü gerçekleştireceğiz (implement). Yeni bir değeri parça parça, kolaylık sağlayan fonksiyonlar kullanarak oluşturmayı desteklemek için “inşa edici desenini (builder pattern)” kullanacağız.

Eksik parçaları doldurun.

#[derive(Debug)]
enum Language {
    Rust,
    Java,
    Perl,
}

#[derive(Clone, Debug)]
struct Dependency {
    name: String,
    version_expression: String,
}

/// Bir yazılım paketinin bir temsili.
#[derive(Debug)]
struct Package {
    name: String,
    version: String,
    authors: Vec<String>,
    dependencies: Vec<Dependency>,
    language: Option<Language>,
}

impl Package {
    /// Bu paketin bir bağımlılık olarak bir temsilini, diğer paketleri
    /// inşa etmek (build) için döndürün.
    fn as_dependency(&self) -> Dependency {
        todo!("1")
    }
}

/// Bir Paket için bir inşa edici (builder). `Package`'ın kendisini oluşturmak için `build()` kullanın.
struct PackageBuilder(Package);

impl PackageBuilder {
    fn new(name: impl Into<String>) -> Self {
        todo!("2")
    }

    /// Paket sürümünü ayarlayın.
    fn version(mut self, version: impl Into<String>) -> Self {
        self.0.version = version.into();
        self
    }

    /// Paket yazarlarını ayarlayın.
    fn authors(mut self, authors: Vec<String>) -> Self {
        todo!("3")
    }

    /// Ek bir bağımlılık ekleyin.
    fn dependency(mut self, dependency: Dependency) -> Self {
        todo!("4")
    }

    /// Dili ayarlayın. Ayarlanmazsa, dil varsayılan olarak None olur.
    fn language(mut self, language: Language) -> Self {
        todo!("5")
    }

    fn build(self) -> Package {
        self.0
    }
}

fn main() {
    let base64 = PackageBuilder::new("base64").version("0.13").build();
    dbg!(&base64);
    let log =
        PackageBuilder::new("log").version("0.4").language(Language::Rust).build();
    dbg!(&log);
    let serde = PackageBuilder::new("serde")
        .authors(vec!["djmitche".into()])
        .version(String::from("4.0"))
        .dependency(base64.as_dependency())
        .dependency(log.as_dependency())
        .build();
    dbg!(serde);
}