fixed generics

This commit is contained in:
Priec
2025-08-02 00:19:45 +02:00
parent 643db8e586
commit 2b08e64db8
2 changed files with 59 additions and 72 deletions

View File

@@ -24,7 +24,7 @@ pub trait DataProvider {
} }
/// Get display value (for password masking, etc.) - optional /// Get display value (for password masking, etc.) - optional
fn display_value(&self, index: usize) -> Option<&str> { fn display_value(&self, _index: usize) -> Option<&str> {
None // Default: use actual value None // Default: use actual value
} }
} }
@@ -32,16 +32,13 @@ pub trait DataProvider {
/// Optional: User implements this for autocomplete data /// Optional: User implements this for autocomplete data
#[async_trait] #[async_trait]
pub trait AutocompleteProvider { pub trait AutocompleteProvider {
type SuggestionData: Clone + Send + 'static;
/// Fetch autocomplete suggestions (user's business logic) /// Fetch autocomplete suggestions (user's business logic)
async fn fetch_suggestions(&mut self, field_index: usize, query: &str) async fn fetch_suggestions(&mut self, field_index: usize, query: &str)
-> Result<Vec<SuggestionItem<Self::SuggestionData>>>; -> Result<Vec<SuggestionItem>>;
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct SuggestionItem<T> { pub struct SuggestionItem {
pub data: T,
pub display_text: String, pub display_text: String,
pub value_to_store: String, pub value_to_store: String,
} }

View File

@@ -15,7 +15,7 @@ pub struct FormEditor<D: DataProvider> {
data_provider: D, data_provider: D,
// Autocomplete suggestions (library manages UI, user provides data) // Autocomplete suggestions (library manages UI, user provides data)
pub(crate) suggestions: Vec<SuggestionItem<String>>, pub(crate) suggestions: Vec<SuggestionItem>,
} }
impl<D: DataProvider> FormEditor<D> { impl<D: DataProvider> FormEditor<D> {
@@ -72,7 +72,7 @@ impl<D: DataProvider> FormEditor<D> {
} }
/// Get autocomplete suggestions for rendering (read-only) /// Get autocomplete suggestions for rendering (read-only)
pub fn suggestions(&self) -> &[SuggestionItem<String>] { pub fn suggestions(&self) -> &[SuggestionItem] {
&self.suggestions &self.suggestions
} }
@@ -161,7 +161,6 @@ impl<D: DataProvider> FormEditor<D> {
pub async fn trigger_autocomplete<A>(&mut self, provider: &mut A) -> Result<()> pub async fn trigger_autocomplete<A>(&mut self, provider: &mut A) -> Result<()>
where where
A: AutocompleteProvider, A: AutocompleteProvider,
A::SuggestionData: std::fmt::Debug, // Change from Display to Debug
{ {
let field_index = self.ui_state.current_field; let field_index = self.ui_state.current_field;
@@ -172,18 +171,9 @@ impl<D: DataProvider> FormEditor<D> {
// Activate autocomplete UI // Activate autocomplete UI
self.ui_state.activate_autocomplete(field_index); self.ui_state.activate_autocomplete(field_index);
// Fetch suggestions from user // Fetch suggestions from user (no conversion needed!)
let query = self.current_text(); let query = self.current_text();
let suggestions = provider.fetch_suggestions(field_index, query).await?; self.suggestions = provider.fetch_suggestions(field_index, query).await?;
// Convert to library's format (could be avoided with better generics)
self.suggestions = suggestions.into_iter()
.map(|item| SuggestionItem {
data: format!("{:?}", item.data), // Use Debug formatting instead
display_text: item.display_text,
value_to_store: item.value_to_store,
})
.collect();
// Update UI state // Update UI state
self.ui_state.autocomplete.is_loading = false; self.ui_state.autocomplete.is_loading = false;