Struct sql_schema_connector::SqlSchemaConnector
source · pub struct SqlSchemaConnector { /* private fields */ }
Expand description
The top-level SQL migration connector.
Implementations§
source§impl SqlSchemaConnector
impl SqlSchemaConnector
sourcepub fn new_postgres() -> Self
pub fn new_postgres() -> Self
Initialize a PostgreSQL migration connector.
sourcepub fn new_cockroach() -> Self
pub fn new_cockroach() -> Self
Initialize a CockroachDb migration connector.
sourcepub fn new_postgres_like() -> Self
pub fn new_postgres_like() -> Self
Initialize a PostgreSQL-like schema connector.
Use Self::new_postgres()
or Self::new_cockroach()
instead when the provider is
explicitly specified by user or already known otherwise.
sourcepub fn new_sqlite() -> Self
pub fn new_sqlite() -> Self
Initialize a SQLite migration connector.
sourcepub fn describe_schema(
&mut self,
namespaces: Option<Namespaces>
) -> BoxFuture<'_, ConnectorResult<SqlSchema>>
pub fn describe_schema( &mut self, namespaces: Option<Namespaces> ) -> BoxFuture<'_, ConnectorResult<SqlSchema>>
Made public for tests.
sourcepub async fn query_raw(
&mut self,
sql: &str,
params: &[Value<'_>]
) -> ConnectorResult<ResultSet>
pub async fn query_raw( &mut self, sql: &str, params: &[Value<'_>] ) -> ConnectorResult<ResultSet>
For tests
sourcepub async fn query(
&mut self,
query: impl Into<Query<'_>>
) -> ConnectorResult<ResultSet>
pub async fn query( &mut self, query: impl Into<Query<'_>> ) -> ConnectorResult<ResultSet>
For tests
sourcepub async fn raw_cmd(&mut self, sql: &str) -> ConnectorResult<()>
pub async fn raw_cmd(&mut self, sql: &str) -> ConnectorResult<()>
For tests
sourcepub fn set_params(&mut self, params: ConnectorParams) -> ConnectorResult<()>
pub fn set_params(&mut self, params: ConnectorParams) -> ConnectorResult<()>
Prepare the connector to connect.
Trait Implementations§
source§impl DestructiveChangeChecker for SqlSchemaConnector
impl DestructiveChangeChecker for SqlSchemaConnector
source§fn check<'a>(
&'a mut self,
migration: &'a Migration
) -> BoxFuture<'a, ConnectorResult<DestructiveChangeDiagnostics>>
fn check<'a>( &'a mut self, migration: &'a Migration ) -> BoxFuture<'a, ConnectorResult<DestructiveChangeDiagnostics>>
Check destructive changes resulting of applying the provided migration.
source§fn pure_check(&self, migration: &Migration) -> DestructiveChangeDiagnostics
fn pure_check(&self, migration: &Migration) -> DestructiveChangeDiagnostics
Check the migration for destructive or unexecutable steps
without performing any IO.
source§impl MigrationPersistence for SqlSchemaConnector
impl MigrationPersistence for SqlSchemaConnector
source§fn baseline_initialize(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
fn baseline_initialize(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
Initialize the migration persistence without checking the database first.
source§fn initialize(
&mut self,
namespaces: Option<Namespaces>
) -> BoxFuture<'_, ConnectorResult<()>>
fn initialize( &mut self, namespaces: Option<Namespaces> ) -> BoxFuture<'_, ConnectorResult<()>>
This method is responsible for checking whether the migrations
persistence is initialized. Read more
source§fn mark_migration_applied_impl<'a>(
&'a mut self,
migration_name: &'a str,
checksum: &'a str
) -> BoxFuture<'a, ConnectorResult<String>>
fn mark_migration_applied_impl<'a>( &'a mut self, migration_name: &'a str, checksum: &'a str ) -> BoxFuture<'a, ConnectorResult<String>>
Implementation in the connector for the core’s MarkMigrationApplied
command. See the docs there. Note that the started_at and finished_at
for the migration should be the same.
source§fn mark_migration_rolled_back_by_id<'a>(
&'a mut self,
migration_id: &'a str
) -> BoxFuture<'a, ConnectorResult<()>>
fn mark_migration_rolled_back_by_id<'a>( &'a mut self, migration_id: &'a str ) -> BoxFuture<'a, ConnectorResult<()>>
Mark the failed instances of the migration in the persistence as rolled
back, so they will be ignored by the engine in the future.
source§fn record_migration_started_impl<'a>(
&'a mut self,
migration_name: &'a str,
checksum: &'a str
) -> BoxFuture<'a, ConnectorResult<String>>
fn record_migration_started_impl<'a>( &'a mut self, migration_name: &'a str, checksum: &'a str ) -> BoxFuture<'a, ConnectorResult<String>>
Record that a migration is about to be applied. Returns the unique
identifier for the migration. Read more
source§fn record_successful_step<'a>(
&'a mut self,
id: &'a str
) -> BoxFuture<'a, ConnectorResult<()>>
fn record_successful_step<'a>( &'a mut self, id: &'a str ) -> BoxFuture<'a, ConnectorResult<()>>
Increase the applied_steps_count counter.
source§fn record_failed_step<'a>(
&'a mut self,
id: &'a str,
logs: &'a str
) -> BoxFuture<'a, ConnectorResult<()>>
fn record_failed_step<'a>( &'a mut self, id: &'a str, logs: &'a str ) -> BoxFuture<'a, ConnectorResult<()>>
Report logs for a failed migration step. We assume the next steps in the
migration will not be applied, and the error reported.
source§fn record_migration_finished<'a>(
&'a mut self,
id: &'a str
) -> BoxFuture<'a, ConnectorResult<()>>
fn record_migration_finished<'a>( &'a mut self, id: &'a str ) -> BoxFuture<'a, ConnectorResult<()>>
Record that the migration completed successfully. This means
populating the
finished_at
field in the migration record.source§fn list_migrations(
&mut self
) -> BoxFuture<'_, ConnectorResult<Result<Vec<MigrationRecord>, PersistenceNotInitializedError>>>
fn list_migrations( &mut self ) -> BoxFuture<'_, ConnectorResult<Result<Vec<MigrationRecord>, PersistenceNotInitializedError>>>
List all applied migrations, ordered by
started_at
. This should fail
with a PersistenceNotInitializedError when the migration persistence is
not initialized.source§fn mark_migration_applied<'a>(
&'a mut self,
migration_name: &'a str,
script: &'a str
) -> Pin<Box<dyn Future<Output = Result<String, ConnectorError>> + Send + 'a>>
fn mark_migration_applied<'a>( &'a mut self, migration_name: &'a str, script: &'a str ) -> Pin<Box<dyn Future<Output = Result<String, ConnectorError>> + Send + 'a>>
Implementation in the connector for the core’s MarkMigrationApplied
command. See the docs there. Note that the started_at and finished_at
for the migration should be the same. Read more
source§impl SchemaConnector for SqlSchemaConnector
impl SchemaConnector for SqlSchemaConnector
source§fn check_database_version_compatibility(
&self,
datamodel: &ValidatedSchema
) -> Option<DatabaseVersionIncompatibility>
fn check_database_version_compatibility( &self, datamodel: &ValidatedSchema ) -> Option<DatabaseVersionIncompatibility>
Optionally check that the features implied by the provided datamodel are all compatible with the specific database version being used.
source§fn set_host(&mut self, host: Arc<dyn ConnectorHost>)
fn set_host(&mut self, host: Arc<dyn ConnectorHost>)
Accept a new ConnectorHost.
source§fn set_params(&mut self, params: ConnectorParams) -> ConnectorResult<()>
fn set_params(&mut self, params: ConnectorParams) -> ConnectorResult<()>
Accept and validate new ConnectorParams. This should fail if it is called twice on the same
connector.
source§fn set_preview_features(&mut self, preview_features: BitFlags<PreviewFeature>)
fn set_preview_features(&mut self, preview_features: BitFlags<PreviewFeature>)
Accept a new set of enabled preview features.
source§fn connection_string(&self) -> Option<&str>
fn connection_string(&self) -> Option<&str>
Return the connection string that was used to initialize this connector in set_params().
source§fn connector_type(&self) -> &'static str
fn connector_type(&self) -> &'static str
A string that should identify what database backend is being used. Note that this is not necessarily
the connector name. The SQL connector for example can return “postgresql”, “mysql” or “sqlite”.
source§fn acquire_lock(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
fn acquire_lock(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
If possible on the target connector, acquire an advisory lock, so multiple instances of migrate do not run concurrently.
source§fn apply_migration<'a>(
&'a mut self,
migration: &'a Migration
) -> BoxFuture<'a, ConnectorResult<u32>>
fn apply_migration<'a>( &'a mut self, migration: &'a Migration ) -> BoxFuture<'a, ConnectorResult<u32>>
Applies the migration to the database. Returns the number of executed steps.
source§fn apply_script<'a>(
&'a mut self,
migration_name: &'a str,
script: &'a str
) -> BoxFuture<'a, ConnectorResult<()>>
fn apply_script<'a>( &'a mut self, migration_name: &'a str, script: &'a str ) -> BoxFuture<'a, ConnectorResult<()>>
Apply a migration script to the database. The migration persistence is
managed by the core.
source§fn empty_database_schema(&self) -> DatabaseSchema
fn empty_database_schema(&self) -> DatabaseSchema
An empty database schema (for diffing).
source§fn ensure_connection_validity(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
fn ensure_connection_validity(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
Make sure the connection to the database is established and valid.
Connectors can choose to connect lazily, but this method should force
them to connect.
source§fn host(&self) -> &Arc<dyn ConnectorHost>
fn host(&self) -> &Arc<dyn ConnectorHost>
Return the ConnectorHost passed with set_host.
source§fn version(&mut self) -> BoxFuture<'_, ConnectorResult<String>>
fn version(&mut self) -> BoxFuture<'_, ConnectorResult<String>>
The version of the underlying database.
source§fn create_database(&mut self) -> BoxFuture<'_, ConnectorResult<String>>
fn create_database(&mut self) -> BoxFuture<'_, ConnectorResult<String>>
Create the database referenced by Prisma schema that was used to initialize the connector.
source§fn database_schema_from_diff_target<'a>(
&'a mut self,
diff_target: DiffTarget<'a>,
shadow_database_connection_string: Option<String>,
namespaces: Option<Namespaces>
) -> BoxFuture<'a, ConnectorResult<DatabaseSchema>>
fn database_schema_from_diff_target<'a>( &'a mut self, diff_target: DiffTarget<'a>, shadow_database_connection_string: Option<String>, namespaces: Option<Namespaces> ) -> BoxFuture<'a, ConnectorResult<DatabaseSchema>>
Read a schema for diffing. The shadow database connection string is strictly optional, you
don’t need to pass it if a shadow database url was passed in params, or if it can be
inferred from context, or if it isn’t necessary for the task at hand.
When MultiSchema is enabled, the namespaces are required for diffing anything other than a
prisma schema, because that information is otherwise unavailable.
source§fn db_execute(&mut self, script: String) -> BoxFuture<'_, ConnectorResult<()>>
fn db_execute(&mut self, script: String) -> BoxFuture<'_, ConnectorResult<()>>
Send a command to the database directly.
source§fn diff(&self, from: DatabaseSchema, to: DatabaseSchema) -> Migration
fn diff(&self, from: DatabaseSchema, to: DatabaseSchema) -> Migration
Create a migration by comparing two database schemas.
source§fn drop_database(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
fn drop_database(&mut self) -> BoxFuture<'_, ConnectorResult<()>>
Drop the database referenced by Prisma schema that was used to initialize the connector.
source§fn introspect<'a>(
&'a mut self,
ctx: &'a IntrospectionContext
) -> BoxFuture<'a, ConnectorResult<IntrospectionResult>>
fn introspect<'a>( &'a mut self, ctx: &'a IntrospectionContext ) -> BoxFuture<'a, ConnectorResult<IntrospectionResult>>
In-tro-spec-shon.
source§fn migration_file_extension(&self) -> &'static str
fn migration_file_extension(&self) -> &'static str
The file extension for generated migration files.
source§fn migration_len(&self, migration: &Migration) -> usize
fn migration_len(&self, migration: &Migration) -> usize
Return the number of steps in the migration.
Invariant: migration_is_empty() == true iff migration_len() == 0.
source§fn render_script(
&self,
migration: &Migration,
diagnostics: &DestructiveChangeDiagnostics
) -> ConnectorResult<String>
fn render_script( &self, migration: &Migration, diagnostics: &DestructiveChangeDiagnostics ) -> ConnectorResult<String>
Render the migration to a runnable script. Read more
source§fn reset(
&mut self,
soft: bool,
namespaces: Option<Namespaces>
) -> BoxFuture<'_, ConnectorResult<()>>
fn reset( &mut self, soft: bool, namespaces: Option<Namespaces> ) -> BoxFuture<'_, ConnectorResult<()>>
Drop all database state. Read more
source§fn migration_summary(&self, migration: &Migration) -> String
fn migration_summary(&self, migration: &Migration) -> String
Render a human-readable drift summary for the migration.
source§fn destructive_change_checker(&mut self) -> &mut dyn DestructiveChangeChecker
fn destructive_change_checker(&mut self) -> &mut dyn DestructiveChangeChecker
source§fn migration_persistence(&mut self) -> &mut dyn MigrationPersistence
fn migration_persistence(&mut self) -> &mut dyn MigrationPersistence
See MigrationPersistence.
source§fn validate_migrations<'a>(
&'a mut self,
migrations: &'a [MigrationDirectory],
namespaces: Option<Namespaces>
) -> BoxFuture<'a, ConnectorResult<()>>
fn validate_migrations<'a>( &'a mut self, migrations: &'a [MigrationDirectory], namespaces: Option<Namespaces> ) -> BoxFuture<'a, ConnectorResult<()>>
If possible, check that the passed in migrations apply cleanly.
source§fn extract_namespaces(&self, schema: &DatabaseSchema) -> Option<Namespaces>
fn extract_namespaces(&self, schema: &DatabaseSchema) -> Option<Namespaces>
Extract the namespaces from a Sql database schema (it will return None for mongodb).
source§fn migration_is_empty(&self, migration: &Migration) -> bool
fn migration_is_empty(&self, migration: &Migration) -> bool
Return whether the migration is empty.
Auto Trait Implementations§
impl !RefUnwindSafe for SqlSchemaConnector
impl Send for SqlSchemaConnector
impl Sync for SqlSchemaConnector
impl Unpin for SqlSchemaConnector
impl !UnwindSafe for SqlSchemaConnector
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
source§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
Causes
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
Causes
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
Causes
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
Causes
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
Causes
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
Causes
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
Causes
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
Borrows
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
Mutably borrows
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
Borrows
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
Mutably borrows
self
, then passes self.as_mut()
into the pipe
function.source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Immutable access to the
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
Mutable access to the
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
Immutable access to the
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
Mutable access to the
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Immutable access to the
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Mutable access to the
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Calls
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
Calls
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
Calls
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
Calls
.tap_ref_mut()
only in debug builds, and is erased in release
builds.