diff --git a/proto/anki/import_export.proto b/proto/anki/import_export.proto index 85d68e1b8..fbe00086d 100644 --- a/proto/anki/import_export.proto +++ b/proto/anki/import_export.proto @@ -58,7 +58,7 @@ message ImportResponse { repeated Note missing_notetype = 6; repeated Note missing_deck = 7; repeated Note empty_first_field = 8; - ImportCsvRequest.DupeResolution dupe_resolution = 9; + CsvMetadata.DupeResolution dupe_resolution = 9; // Usually the sum of all queues, but may be lower if multiple duplicates // have been updated with the same note. uint32 found_notes = 10; @@ -106,15 +106,8 @@ message MediaEntries { } message ImportCsvRequest { - enum DupeResolution { - UPDATE = 0; - IGNORE = 1; - ADD = 2; - // UPDATE_IF_NEWER = 3; - } string path = 1; CsvMetadata metadata = 2; - DupeResolution dupe_resolution = 3; } message CsvMetadataRequest { @@ -127,6 +120,12 @@ message CsvMetadataRequest { // Column indices are 1-based to make working with them in TS easier, where // unset numerical fields default to 0. message CsvMetadata { + enum DupeResolution { + UPDATE = 0; + IGNORE = 1; + ADD = 2; + // UPDATE_IF_NEWER = 3; + } // Order roughly in ascending expected frequency in note text, because the // delimiter detection algorithm is stupidly picking the first one it // encounters. @@ -168,7 +167,7 @@ message CsvMetadata { bool force_is_html = 12; repeated generic.StringList preview = 13; uint32 guid_column = 14; - ImportCsvRequest.DupeResolution dupe_resolution = 15; + DupeResolution dupe_resolution = 15; } message ExportCardCsvRequest { diff --git a/pylib/anki/collection.py b/pylib/anki/collection.py index 79597a718..4a95bedad 100644 --- a/pylib/anki/collection.py +++ b/pylib/anki/collection.py @@ -35,8 +35,8 @@ BrowserColumns = search_pb2.BrowserColumns StripHtmlMode = card_rendering_pb2.StripHtmlRequest ImportLogWithChanges = import_export_pb2.ImportResponse ImportCsvRequest = import_export_pb2.ImportCsvRequest -DupeResolution = ImportCsvRequest.DupeResolution CsvMetadata = import_export_pb2.CsvMetadata +DupeResolution = CsvMetadata.DupeResolution Delimiter = import_export_pb2.CsvMetadata.Delimiter import copy diff --git a/rslib/build/protobuf.rs b/rslib/build/protobuf.rs index 84056790f..55252fd00 100644 --- a/rslib/build/protobuf.rs +++ b/rslib/build/protobuf.rs @@ -112,7 +112,7 @@ pub fn write_backend_proto_rs() { "#[derive(Copy, serde_derive::Deserialize, serde_derive::Serialize)]", ) .type_attribute( - "ImportCsvRequest.DupeResolution", + "CsvMetadata.DupeResolution", "#[derive(serde_derive::Deserialize, serde_derive::Serialize)]", ) .compile_protos(paths.as_slice(), &[proto_dir]) diff --git a/rslib/src/backend/import_export.rs b/rslib/src/backend/import_export.rs index 24e29a2ff..f8741c431 100644 --- a/rslib/src/backend/import_export.rs +++ b/rslib/src/backend/import_export.rs @@ -86,11 +86,9 @@ impl ImportExportService for Backend { fn import_csv(&self, input: pb::ImportCsvRequest) -> Result { self.with_col(|col| { - let dupe_resolution = input.dupe_resolution(); col.import_csv( &input.path, input.metadata.unwrap_or_default(), - dupe_resolution, self.import_progress_fn(), ) }) diff --git a/rslib/src/import_export/text/csv/import.rs b/rslib/src/import_export/text/csv/import.rs index f355ca0ff..6da753812 100644 --- a/rslib/src/import_export/text/csv/import.rs +++ b/rslib/src/import_export/text/csv/import.rs @@ -10,7 +10,7 @@ use crate::{ import_export::{ text::{ csv::metadata::{CsvDeck, CsvMetadata, CsvNotetype, Delimiter}, - DupeResolution, ForeignData, ForeignNote, NameOrId, + ForeignData, ForeignNote, NameOrId, }, ImportProgress, NoteLog, }, @@ -22,7 +22,6 @@ impl Collection { &mut self, path: &str, metadata: CsvMetadata, - dupe_resolution: DupeResolution, progress_fn: impl 'static + FnMut(ImportProgress, bool) -> bool, ) -> Result> { let file = File::open(path)?; @@ -32,7 +31,7 @@ impl Collection { let notes = ctx.deserialize_csv(file, metadata.delimiter())?; ForeignData { - dupe_resolution, + dupe_resolution: metadata.dupe_resolution(), default_deck, default_notetype, notes, diff --git a/rslib/src/import_export/text/csv/metadata.rs b/rslib/src/import_export/text/csv/metadata.rs index e2cb17f88..10d8985d9 100644 --- a/rslib/src/import_export/text/csv/metadata.rs +++ b/rslib/src/import_export/text/csv/metadata.rs @@ -12,8 +12,9 @@ use strum::IntoEnumIterator; use super::import::build_csv_reader; pub use crate::pb::import_export::{ - csv_metadata::{Deck as CsvDeck, Delimiter, MappedNotetype, Notetype as CsvNotetype}, - import_csv_request::DupeResolution, + csv_metadata::{ + Deck as CsvDeck, Delimiter, DupeResolution, MappedNotetype, Notetype as CsvNotetype, + }, CsvMetadata, }; use crate::{ diff --git a/rslib/src/import_export/text/mod.rs b/rslib/src/import_export/text/mod.rs index e81cbae45..b3cefbdee 100644 --- a/rslib/src/import_export/text/mod.rs +++ b/rslib/src/import_export/text/mod.rs @@ -8,7 +8,7 @@ mod json; use serde_derive::{Deserialize, Serialize}; use super::LogNote; -use crate::pb::import_csv_request::DupeResolution; +use crate::pb::csv_metadata::DupeResolution; #[derive(Debug, Clone, Default, Serialize, Deserialize)] #[serde(default)] diff --git a/ts/import-csv/DupeResolutionSelector.svelte b/ts/import-csv/DupeResolutionSelector.svelte index 47fdefbed..8a4008f5c 100644 --- a/ts/import-csv/DupeResolutionSelector.svelte +++ b/ts/import-csv/DupeResolutionSelector.svelte @@ -8,19 +8,19 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html import * as tr from "../lib/ftl"; import { ImportExport } from "../lib/proto"; - export let dupeResolution: ImportExport.ImportCsvRequest.DupeResolution; + export let dupeResolution: ImportExport.CsvMetadata.DupeResolution; const dupeResolutions = [ { - value: ImportExport.ImportCsvRequest.DupeResolution.UPDATE, + value: ImportExport.CsvMetadata.DupeResolution.UPDATE, label: tr.importingUpdate(), }, { - value: ImportExport.ImportCsvRequest.DupeResolution.ADD, + value: ImportExport.CsvMetadata.DupeResolution.ADD, label: tr.importingDuplicate(), }, { - value: ImportExport.ImportCsvRequest.DupeResolution.IGNORE, + value: ImportExport.CsvMetadata.DupeResolution.IGNORE, label: tr.importingPreserve(), }, ]; diff --git a/ts/import-csv/ImportCsvPage.svelte b/ts/import-csv/ImportCsvPage.svelte index 3f7f445d1..5d5feb2e9 100644 --- a/ts/import-csv/ImportCsvPage.svelte +++ b/ts/import-csv/ImportCsvPage.svelte @@ -30,7 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html export let path: string; export let notetypeNameIds: Notetypes.NotetypeNameId[]; export let deckNameIds: Decks.DeckNameId[]; - export let dupeResolution: ImportExport.ImportCsvRequest.DupeResolution; + export let dupeResolution: ImportExport.CsvMetadata.DupeResolution; export let delimiter: ImportExport.CsvMetadata.Delimiter; export let forceDelimiter: boolean; @@ -75,8 +75,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html await importExport.importCsv( ImportExport.ImportCsvRequest.create({ path, - dupeResolution, metadata: ImportExport.CsvMetadata.create({ + dupeResolution, delimiter, forceDelimiter, isHtml,