Запечатывание с помощью перечислений
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
use std::collections::BTreeMap;
pub enum GetSource {
WebUrl(String),
BytesMap(BTreeMap<String, Vec<u8>>),
}
impl GetSource {
fn get(&self, url: &str) -> Option<&Vec<u8>> {
match self {
Self::WebUrl(source) => unimplemented!(),
Self::BytesMap(map) => map.get(url),
}
}
}
-
Мотивация: API спроектирован вокруг конкретного списка допустимых для него типов, и пользователи API не должны его расширять.
-
Перечисления в Rust — это алгебраические типы данных: для каждого варианта можно определить свою структуру.
Для некоторых предметных областей такого полиморфизма может хватить. Экспериментируйте и смотрите, что работает и какие решения кажутся более разумными.
-
Когда пользовательская часть API ссылается на перечисление, пользователи знают, какие типы допустимы в качестве входных данных, и могут создавать эти типы доступными для этого методами.
-
Если типы, из которых состоит перечисление, имеют инварианты, которые API поддерживает внутри себя, и единственный способ создать эти типы для пользователей — конструкторы, которые создают и поддерживают эти инварианты, то можно быть уверенным, что входные данные обобщённого метода сохраняют свои инварианты.
-
Если же типы, из которых состоит перечисление, — это типы, которые пользователь может свободно создавать, то, возможно, придётся учитывать санитизацию и интерпретацию данных.
-